//===----------------------------------------------------------------------===//
//
// This source file is part of the Soto for AWS open source project
//
// Copyright (c) 2017-2024 the Soto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of Soto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

// THIS FILE IS AUTOMATICALLY GENERATED by https://github.com/soto-project/soto-codegenerator.
// DO NOT EDIT.

#if canImport(FoundationEssentials)
import FoundationEssentials
#else
import Foundation
#endif
@_exported import SotoCore

/// Service object for interacting with AWS DataSync service.
///
/// DataSync DataSync is an online data movement service that simplifies data migration and helps you quickly, easily, and securely transfer your file or object data to, from, and between Amazon Web Services storage services. This API interface reference includes documentation for using DataSync programmatically. For complete information, see the  DataSync User Guide .
public struct DataSync: AWSService {
    // MARK: Member variables

    /// Client used for communication with AWS
    public let client: AWSClient
    /// Service configuration
    public let config: AWSServiceConfig

    // MARK: Initialization

    /// Initialize the DataSync client
    /// - parameters:
    ///     - client: AWSClient used to process requests
    ///     - region: Region of server you want to communicate with. This will override the partition parameter.
    ///     - partition: AWS partition where service resides, standard (.aws), china (.awscn), government (.awsusgov).
    ///     - endpoint: Custom endpoint URL to use instead of standard AWS servers
    ///     - middleware: Middleware chain used to edit requests before they are sent and responses before they are decoded 
    ///     - timeout: Timeout value for HTTP requests
    ///     - byteBufferAllocator: Allocator for ByteBuffers
    ///     - options: Service options
    public init(
        client: AWSClient,
        region: SotoCore.Region? = nil,
        partition: AWSPartition = .aws,
        endpoint: String? = nil,
        middleware: AWSMiddlewareProtocol? = nil,
        timeout: TimeAmount? = nil,
        byteBufferAllocator: ByteBufferAllocator = ByteBufferAllocator(),
        options: AWSServiceConfig.Options = []
    ) {
        self.client = client
        self.config = AWSServiceConfig(
            region: region,
            partition: region?.partition ?? partition,
            amzTarget: "FmrsService",
            serviceName: "DataSync",
            serviceIdentifier: "datasync",
            serviceProtocol: .json(version: "1.1"),
            apiVersion: "2018-11-09",
            endpoint: endpoint,
            variantEndpoints: Self.variantEndpoints,
            errorType: DataSyncErrorType.self,
            middleware: middleware,
            timeout: timeout,
            byteBufferAllocator: byteBufferAllocator,
            options: options
        )
    }




    /// FIPS and dualstack endpoints
    static var variantEndpoints: [EndpointVariantType: AWSServiceConfig.EndpointVariant] {[
        [.dualstack]: .init(endpoints: [
            "af-south-1": "datasync.af-south-1.api.aws",
            "ap-east-1": "datasync.ap-east-1.api.aws",
            "ap-northeast-1": "datasync.ap-northeast-1.api.aws",
            "ap-northeast-2": "datasync.ap-northeast-2.api.aws",
            "ap-northeast-3": "datasync.ap-northeast-3.api.aws",
            "ap-south-1": "datasync.ap-south-1.api.aws",
            "ap-south-2": "datasync.ap-south-2.api.aws",
            "ap-southeast-1": "datasync.ap-southeast-1.api.aws",
            "ap-southeast-2": "datasync.ap-southeast-2.api.aws",
            "ap-southeast-3": "datasync.ap-southeast-3.api.aws",
            "ap-southeast-4": "datasync.ap-southeast-4.api.aws",
            "ap-southeast-5": "datasync.ap-southeast-5.api.aws",
            "ap-southeast-7": "datasync.ap-southeast-7.api.aws",
            "ca-central-1": "datasync.ca-central-1.api.aws",
            "ca-west-1": "datasync.ca-west-1.api.aws",
            "cn-north-1": "datasync.cn-north-1.api.amazonwebservices.com.cn",
            "cn-northwest-1": "datasync.cn-northwest-1.api.amazonwebservices.com.cn",
            "eu-central-1": "datasync.eu-central-1.api.aws",
            "eu-central-2": "datasync.eu-central-2.api.aws",
            "eu-north-1": "datasync.eu-north-1.api.aws",
            "eu-south-1": "datasync.eu-south-1.api.aws",
            "eu-south-2": "datasync.eu-south-2.api.aws",
            "eu-west-1": "datasync.eu-west-1.api.aws",
            "eu-west-2": "datasync.eu-west-2.api.aws",
            "eu-west-3": "datasync.eu-west-3.api.aws",
            "il-central-1": "datasync.il-central-1.api.aws",
            "me-central-1": "datasync.me-central-1.api.aws",
            "me-south-1": "datasync.me-south-1.api.aws",
            "mx-central-1": "datasync.mx-central-1.api.aws",
            "sa-east-1": "datasync.sa-east-1.api.aws",
            "us-east-1": "datasync.us-east-1.api.aws",
            "us-east-2": "datasync.us-east-2.api.aws",
            "us-gov-east-1": "datasync.us-gov-east-1.api.aws",
            "us-gov-west-1": "datasync.us-gov-west-1.api.aws",
            "us-west-1": "datasync.us-west-1.api.aws",
            "us-west-2": "datasync.us-west-2.api.aws"
        ]),
        [.dualstack, .fips]: .init(endpoints: [
            "ca-central-1": "datasync-fips.ca-central-1.api.aws",
            "ca-west-1": "datasync-fips.ca-west-1.api.aws",
            "us-east-1": "datasync-fips.us-east-1.api.aws",
            "us-east-2": "datasync-fips.us-east-2.api.aws",
            "us-gov-east-1": "datasync-fips.us-gov-east-1.api.aws",
            "us-gov-west-1": "datasync-fips.us-gov-west-1.api.aws",
            "us-west-1": "datasync-fips.us-west-1.api.aws",
            "us-west-2": "datasync-fips.us-west-2.api.aws"
        ]),
        [.fips]: .init(endpoints: [
            "ca-central-1": "datasync-fips.ca-central-1.amazonaws.com",
            "ca-west-1": "datasync-fips.ca-west-1.amazonaws.com",
            "us-east-1": "datasync-fips.us-east-1.amazonaws.com",
            "us-east-2": "datasync-fips.us-east-2.amazonaws.com",
            "us-gov-east-1": "datasync-fips.us-gov-east-1.amazonaws.com",
            "us-gov-west-1": "datasync-fips.us-gov-west-1.amazonaws.com",
            "us-iso-east-1": "datasync-fips.us-iso-east-1.c2s.ic.gov",
            "us-iso-west-1": "datasync-fips.us-iso-west-1.c2s.ic.gov",
            "us-west-1": "datasync-fips.us-west-1.amazonaws.com",
            "us-west-2": "datasync-fips.us-west-2.amazonaws.com"
        ])
    ]}

    // MARK: API Calls

    /// Stops an DataSync task execution that's in progress. The transfer of some files are abruptly interrupted. File contents that're transferred to the destination might be incomplete or inconsistent with the source files. However, if you start a new task execution using the same task and allow it to finish, file content on the destination will be complete and consistent. This applies to other unexpected failures that interrupt a task execution. In all of these cases, DataSync successfully completes the transfer when you start the next task execution.
    @Sendable
    @inlinable
    public func cancelTaskExecution(_ input: CancelTaskExecutionRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CancelTaskExecutionResponse {
        try await self.client.execute(
            operation: "CancelTaskExecution", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Stops an DataSync task execution that's in progress. The transfer of some files are abruptly interrupted. File contents that're transferred to the destination might be incomplete or inconsistent with the source files. However, if you start a new task execution using the same task and allow it to finish, file content on the destination will be complete and consistent. This applies to other unexpected failures that interrupt a task execution. In all of these cases, DataSync successfully completes the transfer when you start the next task execution.
    ///
    /// Parameters:
    ///   - taskExecutionArn: The Amazon Resource Name (ARN) of the task execution to stop.
    ///   - logger: Logger use during operation
    @inlinable
    public func cancelTaskExecution(
        taskExecutionArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CancelTaskExecutionResponse {
        let input = CancelTaskExecutionRequest(
            taskExecutionArn: taskExecutionArn
        )
        return try await self.cancelTaskExecution(input, logger: logger)
    }

    /// Activates an DataSync agent that you deploy in your storage environment. The activation process associates the agent with your Amazon Web Services account. If you haven't deployed an agent yet, see Do I need a DataSync agent?
    @Sendable
    @inlinable
    public func createAgent(_ input: CreateAgentRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateAgentResponse {
        try await self.client.execute(
            operation: "CreateAgent", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Activates an DataSync agent that you deploy in your storage environment. The activation process associates the agent with your Amazon Web Services account. If you haven't deployed an agent yet, see Do I need a DataSync agent?
    ///
    /// Parameters:
    ///   - activationKey: Specifies your DataSync agent's activation key. If you don't have an activation key, see Activating your agent.
    ///   - agentName: Specifies a name for your agent. We recommend specifying a name that you can remember.
    ///   - securityGroupArns: Specifies the Amazon Resource Name (ARN) of the security group that allows traffic between your agent and VPC service endpoint. You can only specify one ARN.
    ///   - subnetArns: Specifies the ARN of the subnet where your VPC service endpoint is located. You can only specify one ARN.
    ///   - tags: Specifies labels that help you categorize, filter, and search for your Amazon Web Services resources. We recommend creating at least one tag for your agent.
    ///   - vpcEndpointId: Specifies the ID of the VPC service endpoint that you're using. For example, a VPC endpoint ID looks like vpce-01234d5aff67890e1.  The VPC service endpoint you use must include the DataSync service name (for example, com.amazonaws.us-east-2.datasync).
    ///   - logger: Logger use during operation
    @inlinable
    public func createAgent(
        activationKey: String,
        agentName: String? = nil,
        securityGroupArns: [String]? = nil,
        subnetArns: [String]? = nil,
        tags: [TagListEntry]? = nil,
        vpcEndpointId: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateAgentResponse {
        let input = CreateAgentRequest(
            activationKey: activationKey, 
            agentName: agentName, 
            securityGroupArns: securityGroupArns, 
            subnetArns: subnetArns, 
            tags: tags, 
            vpcEndpointId: vpcEndpointId
        )
        return try await self.createAgent(input, logger: logger)
    }

    /// Creates a transfer location for a Microsoft Azure Blob Storage container. DataSync can use this location as a transfer source or destination. You can make transfers with or without a DataSync agent that connects to your container. Before you begin, make sure you know how DataSync accesses Azure Blob Storage and works with access tiers and blob types.
    @Sendable
    @inlinable
    public func createLocationAzureBlob(_ input: CreateLocationAzureBlobRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateLocationAzureBlobResponse {
        try await self.client.execute(
            operation: "CreateLocationAzureBlob", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a transfer location for a Microsoft Azure Blob Storage container. DataSync can use this location as a transfer source or destination. You can make transfers with or without a DataSync agent that connects to your container. Before you begin, make sure you know how DataSync accesses Azure Blob Storage and works with access tiers and blob types.
    ///
    /// Parameters:
    ///   - accessTier: Specifies the access tier that you want your objects or files transferred into. This only applies when using the location as a transfer destination. For more information, see Access tiers.
    ///   - agentArns: (Optional) Specifies the Amazon Resource Name (ARN) of the DataSync agent that can connect with your Azure Blob Storage container. If you are setting up an agentless cross-cloud transfer, you do not need to specify a value for this parameter. You can specify more than one agent. For more information, see Using multiple agents for your transfer.  Make sure you configure this parameter correctly when you first create your storage location. You cannot add or remove agents from a storage location after you create it.
    ///   - authenticationType: Specifies the authentication method DataSync uses to access your Azure Blob Storage. DataSync can access blob storage using a shared access signature (SAS).
    ///   - blobType: Specifies the type of blob that you want your objects or files to be when transferring them into Azure Blob Storage. Currently, DataSync only supports moving data into Azure Blob Storage as block blobs. For more information on blob types, see the Azure Blob Storage documentation.
    ///   - cmkSecretConfig: Specifies configuration information for a DataSync-managed secret, which includes the authentication token that DataSync uses to access a specific AzureBlob storage location, with a customer-managed KMS key. When you include this paramater as part of a CreateLocationAzureBlob request, you provide only the KMS key ARN. DataSync uses this KMS key together with the authentication token you specify for SasConfiguration to create a DataSync-managed secret to store the location access credentials. Make sure the DataSync has permission to access the KMS key that you specify.  You can use either CmkSecretConfig (with SasConfiguration) or CustomSecretConfig (without SasConfiguration) to provide credentials for a CreateLocationAzureBlob request. Do not provide both parameters for the same request.
    ///   - containerUrl: Specifies the URL of the Azure Blob Storage container involved in your transfer.
    ///   - customSecretConfig: Specifies configuration information for a customer-managed Secrets Manager secret where the authentication token for an AzureBlob storage location is stored in plain text. This configuration includes the secret ARN, and the ARN for an IAM role that provides access to the secret.  You can use either CmkSecretConfig (with SasConfiguration) or CustomSecretConfig (without SasConfiguration) to provide credentials for a CreateLocationAzureBlob request. Do not provide both parameters for the same request.
    ///   - sasConfiguration: Specifies the SAS configuration that allows DataSync to access your Azure Blob Storage.  If you provide an authentication token using SasConfiguration, but do not provide secret configuration details using CmkSecretConfig or CustomSecretConfig, then DataSync stores the token using your Amazon Web Services account's secrets manager secret.
    ///   - subdirectory: Specifies path segments if you want to limit your transfer to a virtual directory in your container (for example, /my/images).
    ///   - tags: Specifies labels that help you categorize, filter, and search for your Amazon Web Services resources. We recommend creating at least a name tag for your transfer location.
    ///   - logger: Logger use during operation
    @inlinable
    public func createLocationAzureBlob(
        accessTier: AzureAccessTier? = nil,
        agentArns: [String]? = nil,
        authenticationType: AzureBlobAuthenticationType,
        blobType: AzureBlobType? = nil,
        cmkSecretConfig: CmkSecretConfig? = nil,
        containerUrl: String,
        customSecretConfig: CustomSecretConfig? = nil,
        sasConfiguration: AzureBlobSasConfiguration? = nil,
        subdirectory: String? = nil,
        tags: [TagListEntry]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateLocationAzureBlobResponse {
        let input = CreateLocationAzureBlobRequest(
            accessTier: accessTier, 
            agentArns: agentArns, 
            authenticationType: authenticationType, 
            blobType: blobType, 
            cmkSecretConfig: cmkSecretConfig, 
            containerUrl: containerUrl, 
            customSecretConfig: customSecretConfig, 
            sasConfiguration: sasConfiguration, 
            subdirectory: subdirectory, 
            tags: tags
        )
        return try await self.createLocationAzureBlob(input, logger: logger)
    }

    /// Creates a transfer location for an Amazon EFS file system. DataSync can use this location as a source or destination for transferring data. Before you begin, make sure that you understand how DataSync accesses Amazon EFS file systems.
    @Sendable
    @inlinable
    public func createLocationEfs(_ input: CreateLocationEfsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateLocationEfsResponse {
        try await self.client.execute(
            operation: "CreateLocationEfs", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a transfer location for an Amazon EFS file system. DataSync can use this location as a source or destination for transferring data. Before you begin, make sure that you understand how DataSync accesses Amazon EFS file systems.
    ///
    /// Parameters:
    ///   - accessPointArn: Specifies the Amazon Resource Name (ARN) of the access point that DataSync uses to mount your Amazon EFS file system. For more information, see Accessing restricted file systems.
    ///   - ec2Config: Specifies the subnet and security groups DataSync uses to connect to one of your Amazon EFS file system's mount targets.
    ///   - efsFilesystemArn: Specifies the ARN for your Amazon EFS file system.
    ///   - fileSystemAccessRoleArn: Specifies an Identity and Access Management (IAM) role that allows DataSync to access your Amazon EFS file system. For information on creating this role, see Creating a DataSync IAM role for file system access.
    ///   - inTransitEncryption: Specifies whether you want DataSync to use Transport Layer Security (TLS) 1.2 encryption when it transfers data to or from your Amazon EFS file system. If you specify an access point using AccessPointArn or an IAM role using FileSystemAccessRoleArn, you must set this parameter to TLS1_2.
    ///   - subdirectory: Specifies a mount path for your Amazon EFS file system. This is where DataSync reads or writes data on your file system (depending on if this is a source or destination location). By default, DataSync uses the root directory (or access point if you provide one by using AccessPointArn). You can also include subdirectories using forward slashes (for example, /path/to/folder).
    ///   - tags: Specifies the key-value pair that represents a tag that you want to add to the resource. The value can be an empty string. This value helps you manage, filter, and search for your resources. We recommend that you create a name tag for your location.
    ///   - logger: Logger use during operation
    @inlinable
    public func createLocationEfs(
        accessPointArn: String? = nil,
        ec2Config: Ec2Config,
        efsFilesystemArn: String,
        fileSystemAccessRoleArn: String? = nil,
        inTransitEncryption: EfsInTransitEncryption? = nil,
        subdirectory: String? = nil,
        tags: [TagListEntry]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateLocationEfsResponse {
        let input = CreateLocationEfsRequest(
            accessPointArn: accessPointArn, 
            ec2Config: ec2Config, 
            efsFilesystemArn: efsFilesystemArn, 
            fileSystemAccessRoleArn: fileSystemAccessRoleArn, 
            inTransitEncryption: inTransitEncryption, 
            subdirectory: subdirectory, 
            tags: tags
        )
        return try await self.createLocationEfs(input, logger: logger)
    }

    /// Creates a transfer location for an Amazon FSx for Lustre file system. DataSync can use this location as a source or destination for transferring data. Before you begin, make sure that you understand how DataSync accesses FSx for Lustre file systems.
    @Sendable
    @inlinable
    public func createLocationFsxLustre(_ input: CreateLocationFsxLustreRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateLocationFsxLustreResponse {
        try await self.client.execute(
            operation: "CreateLocationFsxLustre", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a transfer location for an Amazon FSx for Lustre file system. DataSync can use this location as a source or destination for transferring data. Before you begin, make sure that you understand how DataSync accesses FSx for Lustre file systems.
    ///
    /// Parameters:
    ///   - fsxFilesystemArn: Specifies the Amazon Resource Name (ARN) of the FSx for Lustre file system.
    ///   - securityGroupArns: Specifies the Amazon Resource Names (ARNs) of up to five security groups that provide access to your FSx for Lustre file system. The security groups must be able to access the file system's ports. The file system must also allow access from the security groups. For information about file system access, see the  Amazon FSx for Lustre User Guide .
    ///   - subdirectory: Specifies a mount path for your FSx for Lustre file system. The path can include subdirectories. When the location is used as a source, DataSync reads data from the mount path. When the location is used as a destination, DataSync writes data to the mount path. If you don't include this parameter, DataSync uses the file system's root directory (/).
    ///   - tags: Specifies labels that help you categorize, filter, and search for your Amazon Web Services resources. We recommend creating at least a name tag for your location.
    ///   - logger: Logger use during operation
    @inlinable
    public func createLocationFsxLustre(
        fsxFilesystemArn: String,
        securityGroupArns: [String],
        subdirectory: String? = nil,
        tags: [TagListEntry]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateLocationFsxLustreResponse {
        let input = CreateLocationFsxLustreRequest(
            fsxFilesystemArn: fsxFilesystemArn, 
            securityGroupArns: securityGroupArns, 
            subdirectory: subdirectory, 
            tags: tags
        )
        return try await self.createLocationFsxLustre(input, logger: logger)
    }

    /// Creates a transfer location for an Amazon FSx for NetApp ONTAP file system. DataSync can use this location as a source or destination for transferring data. Before you begin, make sure that you understand how DataSync accesses FSx for ONTAP file systems.
    @Sendable
    @inlinable
    public func createLocationFsxOntap(_ input: CreateLocationFsxOntapRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateLocationFsxOntapResponse {
        try await self.client.execute(
            operation: "CreateLocationFsxOntap", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a transfer location for an Amazon FSx for NetApp ONTAP file system. DataSync can use this location as a source or destination for transferring data. Before you begin, make sure that you understand how DataSync accesses FSx for ONTAP file systems.
    ///
    /// Parameters:
    ///   - protocol: 
    ///   - securityGroupArns: Specifies the Amazon EC2 security groups that provide access to your file system's preferred subnet. The security groups must allow outbound traffic on the following ports (depending on the protocol you use):    Network File System (NFS): TCP ports 111, 635, and 2049    Server Message Block (SMB): TCP port 445   Your file system's security groups must also allow inbound traffic on the same ports.
    ///   - storageVirtualMachineArn: Specifies the ARN of the storage virtual machine (SVM) in your file system where you want to copy data to or from.
    ///   - subdirectory: Specifies a path to the file share in the SVM where you want to transfer data to or from. You can specify a junction path (also known as a mount point), qtree path (for NFS file shares), or share name (for SMB file shares). For example, your mount path might be /vol1, /vol1/tree1, or /share1.  Don't specify a junction path in the SVM's root volume. For more information, see Managing FSx for ONTAP storage virtual machines in the Amazon FSx for NetApp ONTAP User Guide.
    ///   - tags: Specifies labels that help you categorize, filter, and search for your Amazon Web Services resources. We recommend creating at least a name tag for your location.
    ///   - logger: Logger use during operation
    @inlinable
    public func createLocationFsxOntap(
        protocol: FsxProtocol,
        securityGroupArns: [String],
        storageVirtualMachineArn: String,
        subdirectory: String? = nil,
        tags: [TagListEntry]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateLocationFsxOntapResponse {
        let input = CreateLocationFsxOntapRequest(
            protocol: `protocol`, 
            securityGroupArns: securityGroupArns, 
            storageVirtualMachineArn: storageVirtualMachineArn, 
            subdirectory: subdirectory, 
            tags: tags
        )
        return try await self.createLocationFsxOntap(input, logger: logger)
    }

    /// Creates a transfer location for an Amazon FSx for OpenZFS file system. DataSync can use this location as a source or destination for transferring data. Before you begin, make sure that you understand how DataSync accesses FSx for OpenZFS file systems.  Request parameters related to SMB aren't supported with the CreateLocationFsxOpenZfs operation.
    @Sendable
    @inlinable
    public func createLocationFsxOpenZfs(_ input: CreateLocationFsxOpenZfsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateLocationFsxOpenZfsResponse {
        try await self.client.execute(
            operation: "CreateLocationFsxOpenZfs", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a transfer location for an Amazon FSx for OpenZFS file system. DataSync can use this location as a source or destination for transferring data. Before you begin, make sure that you understand how DataSync accesses FSx for OpenZFS file systems.  Request parameters related to SMB aren't supported with the CreateLocationFsxOpenZfs operation.
    ///
    /// Parameters:
    ///   - fsxFilesystemArn: The Amazon Resource Name (ARN) of the FSx for OpenZFS file system.
    ///   - protocol: The type of protocol that DataSync uses to access your file system.
    ///   - securityGroupArns: The ARNs of the security groups that are used to configure the FSx for OpenZFS file system.
    ///   - subdirectory: A subdirectory in the location's path that must begin with /fsx. DataSync uses this subdirectory to read or write data (depending on whether the file system is a source or destination location).
    ///   - tags: The key-value pair that represents a tag that you want to add to the resource. The value can be an empty string. This value helps you manage, filter, and search for your resources. We recommend that you create a name tag for your location.
    ///   - logger: Logger use during operation
    @inlinable
    public func createLocationFsxOpenZfs(
        fsxFilesystemArn: String,
        protocol: FsxProtocol,
        securityGroupArns: [String],
        subdirectory: String? = nil,
        tags: [TagListEntry]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateLocationFsxOpenZfsResponse {
        let input = CreateLocationFsxOpenZfsRequest(
            fsxFilesystemArn: fsxFilesystemArn, 
            protocol: `protocol`, 
            securityGroupArns: securityGroupArns, 
            subdirectory: subdirectory, 
            tags: tags
        )
        return try await self.createLocationFsxOpenZfs(input, logger: logger)
    }

    /// Creates a transfer location for an Amazon FSx for Windows File Server file system. DataSync can use this location as a source or destination for transferring data. Before you begin, make sure that you understand how DataSync accesses FSx for Windows File Server file systems.
    @Sendable
    @inlinable
    public func createLocationFsxWindows(_ input: CreateLocationFsxWindowsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateLocationFsxWindowsResponse {
        try await self.client.execute(
            operation: "CreateLocationFsxWindows", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a transfer location for an Amazon FSx for Windows File Server file system. DataSync can use this location as a source or destination for transferring data. Before you begin, make sure that you understand how DataSync accesses FSx for Windows File Server file systems.
    ///
    /// Parameters:
    ///   - domain: Specifies the name of the Windows domain that the FSx for Windows File Server file system belongs to. If you have multiple Active Directory domains in your environment, configuring this parameter makes sure that DataSync connects to the right file system.
    ///   - fsxFilesystemArn: Specifies the Amazon Resource Name (ARN) for the FSx for Windows File Server file system.
    ///   - password: Specifies the password of the user with the permissions to mount and access the files, folders, and file metadata in your FSx for Windows File Server file system.
    ///   - securityGroupArns: Specifies the ARNs of the Amazon EC2 security groups that provide access to your file system's preferred subnet. The security groups that you specify must be able to communicate with your file system's security groups. For information about configuring security groups for file system access, see the  Amazon FSx for Windows File Server User Guide .  If you choose a security group that doesn't allow connections from within itself, do one of the following:   Configure the security group to allow it to communicate within itself.   Choose a different security group that can communicate with the mount target's security group.
    ///   - subdirectory: Specifies a mount path for your file system using forward slashes. This is where DataSync reads or writes data (depending on if this is a source or destination location).
    ///   - tags: Specifies labels that help you categorize, filter, and search for your Amazon Web Services resources. We recommend creating at least a name tag for your location.
    ///   - user: Specifies the user with the permissions to mount and access the files, folders, and file metadata in your FSx for Windows File Server file system. For information about choosing a user with the right level of access for your transfer, see required permissions for FSx for Windows File Server locations.
    ///   - logger: Logger use during operation
    @inlinable
    public func createLocationFsxWindows(
        domain: String? = nil,
        fsxFilesystemArn: String,
        password: String,
        securityGroupArns: [String],
        subdirectory: String? = nil,
        tags: [TagListEntry]? = nil,
        user: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateLocationFsxWindowsResponse {
        let input = CreateLocationFsxWindowsRequest(
            domain: domain, 
            fsxFilesystemArn: fsxFilesystemArn, 
            password: password, 
            securityGroupArns: securityGroupArns, 
            subdirectory: subdirectory, 
            tags: tags, 
            user: user
        )
        return try await self.createLocationFsxWindows(input, logger: logger)
    }

    /// Creates a transfer location for a Hadoop Distributed File System (HDFS). DataSync can use this location as a source or destination for transferring data. Before you begin, make sure that you understand how DataSync accesses HDFS clusters.
    @Sendable
    @inlinable
    public func createLocationHdfs(_ input: CreateLocationHdfsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateLocationHdfsResponse {
        try await self.client.execute(
            operation: "CreateLocationHdfs", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a transfer location for a Hadoop Distributed File System (HDFS). DataSync can use this location as a source or destination for transferring data. Before you begin, make sure that you understand how DataSync accesses HDFS clusters.
    ///
    /// Parameters:
    ///   - agentArns: The Amazon Resource Names (ARNs) of the DataSync agents that can connect to your HDFS cluster.
    ///   - authenticationType: The type of authentication used to determine the identity of the user.
    ///   - blockSize: The size of data blocks to write into the HDFS cluster. The block size must be a multiple of 512 bytes. The default block size is 128 mebibytes (MiB).
    ///   - kerberosKeytab: The Kerberos key table (keytab) that contains mappings between the defined Kerberos principal and the encrypted keys. You can load the keytab from a file by providing the file's address.  If KERBEROS is specified for AuthenticationType, this parameter is required.
    ///   - kerberosKrb5Conf: The krb5.conf file that contains the Kerberos configuration information. You can load the krb5.conf file by providing the file's address. If you're using the CLI, it performs the base64 encoding for you. Otherwise, provide the base64-encoded text.   If KERBEROS is specified for AuthenticationType, this parameter is required.
    ///   - kerberosPrincipal: The Kerberos principal with access to the files and folders on the HDFS cluster.   If KERBEROS is specified for AuthenticationType, this parameter is required.
    ///   - kmsKeyProviderUri: The URI of the HDFS cluster's Key Management Server (KMS).
    ///   - nameNodes: The NameNode that manages the HDFS namespace. The NameNode performs operations such as opening, closing, and renaming files and directories. The NameNode contains the information to map blocks of data to the DataNodes. You can use only one NameNode.
    ///   - qopConfiguration: The Quality of Protection (QOP) configuration specifies the Remote Procedure Call (RPC) and data transfer protection settings configured on the Hadoop Distributed File System (HDFS) cluster. If QopConfiguration isn't specified, RpcProtection and DataTransferProtection default to PRIVACY. If you set RpcProtection or DataTransferProtection, the other parameter assumes the same value.
    ///   - replicationFactor: The number of DataNodes to replicate the data to when writing to the HDFS cluster. By default, data is replicated to three DataNodes.
    ///   - simpleUser: The user name used to identify the client on the host operating system.   If SIMPLE is specified for AuthenticationType, this parameter is required.
    ///   - subdirectory: A subdirectory in the HDFS cluster. This subdirectory is used to read data from or write data to the HDFS cluster. If the subdirectory isn't specified, it will default to /.
    ///   - tags: The key-value pair that represents the tag that you want to add to the location. The value can be an empty string. We recommend using tags to name your resources.
    ///   - logger: Logger use during operation
    @inlinable
    public func createLocationHdfs(
        agentArns: [String],
        authenticationType: HdfsAuthenticationType,
        blockSize: Int? = nil,
        kerberosKeytab: AWSBase64Data? = nil,
        kerberosKrb5Conf: AWSBase64Data? = nil,
        kerberosPrincipal: String? = nil,
        kmsKeyProviderUri: String? = nil,
        nameNodes: [HdfsNameNode],
        qopConfiguration: QopConfiguration? = nil,
        replicationFactor: Int? = nil,
        simpleUser: String? = nil,
        subdirectory: String? = nil,
        tags: [TagListEntry]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateLocationHdfsResponse {
        let input = CreateLocationHdfsRequest(
            agentArns: agentArns, 
            authenticationType: authenticationType, 
            blockSize: blockSize, 
            kerberosKeytab: kerberosKeytab, 
            kerberosKrb5Conf: kerberosKrb5Conf, 
            kerberosPrincipal: kerberosPrincipal, 
            kmsKeyProviderUri: kmsKeyProviderUri, 
            nameNodes: nameNodes, 
            qopConfiguration: qopConfiguration, 
            replicationFactor: replicationFactor, 
            simpleUser: simpleUser, 
            subdirectory: subdirectory, 
            tags: tags
        )
        return try await self.createLocationHdfs(input, logger: logger)
    }

    /// Creates a transfer location for a Network File System (NFS) file server. DataSync can use this location as a source or destination for transferring data. Before you begin, make sure that you understand how DataSync accesses NFS file servers.
    @Sendable
    @inlinable
    public func createLocationNfs(_ input: CreateLocationNfsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateLocationNfsResponse {
        try await self.client.execute(
            operation: "CreateLocationNfs", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a transfer location for a Network File System (NFS) file server. DataSync can use this location as a source or destination for transferring data. Before you begin, make sure that you understand how DataSync accesses NFS file servers.
    ///
    /// Parameters:
    ///   - mountOptions: Specifies the options that DataSync can use to mount your NFS file server.
    ///   - onPremConfig: Specifies the Amazon Resource Name (ARN) of the DataSync agent that can connect to your NFS file server. You can specify more than one agent. For more information, see Using multiple DataSync agents.
    ///   - serverHostname: Specifies the DNS name or IP address (IPv4 or IPv6) of the NFS file server that your DataSync agent connects to.
    ///   - subdirectory: Specifies the export path in your NFS file server that you want DataSync to mount. This path (or a subdirectory of the path) is where DataSync transfers data to or from. For information on configuring an export for DataSync, see Accessing NFS file servers.
    ///   - tags: Specifies labels that help you categorize, filter, and search for your Amazon Web Services resources. We recommend creating at least a name tag for your location.
    ///   - logger: Logger use during operation
    @inlinable
    public func createLocationNfs(
        mountOptions: NfsMountOptions? = nil,
        onPremConfig: OnPremConfig,
        serverHostname: String,
        subdirectory: String,
        tags: [TagListEntry]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateLocationNfsResponse {
        let input = CreateLocationNfsRequest(
            mountOptions: mountOptions, 
            onPremConfig: onPremConfig, 
            serverHostname: serverHostname, 
            subdirectory: subdirectory, 
            tags: tags
        )
        return try await self.createLocationNfs(input, logger: logger)
    }

    /// Creates a transfer location for an object storage system. DataSync can use this location as a source or destination for transferring data. You can make transfers with or without a DataSync agent. Before you begin, make sure that you understand the prerequisites for DataSync to work with object storage systems.
    @Sendable
    @inlinable
    public func createLocationObjectStorage(_ input: CreateLocationObjectStorageRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateLocationObjectStorageResponse {
        try await self.client.execute(
            operation: "CreateLocationObjectStorage", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a transfer location for an object storage system. DataSync can use this location as a source or destination for transferring data. You can make transfers with or without a DataSync agent. Before you begin, make sure that you understand the prerequisites for DataSync to work with object storage systems.
    ///
    /// Parameters:
    ///   - accessKey: Specifies the access key (for example, a user name) if credentials are required to authenticate with the object storage server.
    ///   - agentArns: (Optional) Specifies the Amazon Resource Names (ARNs) of the DataSync agents that can connect with your object storage system. If you are setting up an agentless cross-cloud transfer, you do not need to specify a value for this parameter.  Make sure you configure this parameter correctly when you first create your storage location. You cannot add or remove agents from a storage location after you create it.
    ///   - bucketName: Specifies the name of the object storage bucket involved in the transfer.
    ///   - cmkSecretConfig: Specifies configuration information for a DataSync-managed secret, which includes the SecretKey that DataSync uses to access a specific object storage location, with a customer-managed KMS key. When you include this paramater as part of a CreateLocationObjectStorage request, you provide only the KMS key ARN. DataSync uses this KMS key together with the value you specify for the SecretKey parameter to create a DataSync-managed secret to store the location access credentials. Make sure the DataSync has permission to access the KMS key that you specify.  You can use either CmkSecretConfig (with SecretKey) or CustomSecretConfig (without SecretKey) to provide credentials for a CreateLocationObjectStorage request. Do not provide both parameters for the same request.
    ///   - customSecretConfig: Specifies configuration information for a customer-managed Secrets Manager secret where the secret key for a specific object storage location is stored in plain text. This configuration includes the secret ARN, and the ARN for an IAM role that provides access to the secret.  You can use either CmkSecretConfig (with SecretKey) or CustomSecretConfig (without SecretKey) to provide credentials for a CreateLocationObjectStorage request. Do not provide both parameters for the same request.
    ///   - secretKey: Specifies the secret key (for example, a password) if credentials are required to authenticate with the object storage server.  If you provide a secret using SecretKey, but do not provide secret configuration details using CmkSecretConfig or CustomSecretConfig, then DataSync stores the token using your Amazon Web Services account's Secrets Manager secret.
    ///   - serverCertificate: Specifies a certificate chain for DataSync to authenticate with your object storage system if the system uses a private or self-signed certificate authority (CA). You must specify a single .pem file with a full certificate chain (for example, file:///home/user/.ssh/object_storage_certificates.pem). The certificate chain might include:   The object storage system's certificate   All intermediate certificates (if there are any)   The root certificate of the signing CA   You can concatenate your certificates into a .pem file (which can be up to 32768 bytes before base64 encoding). The following example cat command creates an object_storage_certificates.pem file that includes three certificates:  cat object_server_certificate.pem intermediate_certificate.pem ca_root_certificate.pem > object_storage_certificates.pem  To use this parameter, configure ServerProtocol to HTTPS.
    ///   - serverHostname: Specifies the domain name or IP address (IPv4 or IPv6) of the object storage server that your DataSync agent connects to.
    ///   - serverPort: Specifies the port that your object storage server accepts inbound network traffic on (for example, port 443).
    ///   - serverProtocol: Specifies the protocol that your object storage server uses to communicate. If not specified, the default value is HTTPS.
    ///   - subdirectory: Specifies the object prefix for your object storage server. If this is a source location, DataSync only copies objects with this prefix. If this is a destination location, DataSync writes all objects with this prefix.
    ///   - tags: Specifies the key-value pair that represents a tag that you want to add to the resource. Tags can help you manage, filter, and search for your resources. We recommend creating a name tag for your location.
    ///   - logger: Logger use during operation
    @inlinable
    public func createLocationObjectStorage(
        accessKey: String? = nil,
        agentArns: [String]? = nil,
        bucketName: String,
        cmkSecretConfig: CmkSecretConfig? = nil,
        customSecretConfig: CustomSecretConfig? = nil,
        secretKey: String? = nil,
        serverCertificate: AWSBase64Data? = nil,
        serverHostname: String,
        serverPort: Int? = nil,
        serverProtocol: ObjectStorageServerProtocol? = nil,
        subdirectory: String? = nil,
        tags: [TagListEntry]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateLocationObjectStorageResponse {
        let input = CreateLocationObjectStorageRequest(
            accessKey: accessKey, 
            agentArns: agentArns, 
            bucketName: bucketName, 
            cmkSecretConfig: cmkSecretConfig, 
            customSecretConfig: customSecretConfig, 
            secretKey: secretKey, 
            serverCertificate: serverCertificate, 
            serverHostname: serverHostname, 
            serverPort: serverPort, 
            serverProtocol: serverProtocol, 
            subdirectory: subdirectory, 
            tags: tags
        )
        return try await self.createLocationObjectStorage(input, logger: logger)
    }

    /// Creates a transfer location for an Amazon S3 bucket. DataSync can use this location as a source or destination for transferring data.  Before you begin, make sure that you read the following topics:    Storage class considerations with Amazon S3 locations     Evaluating S3 request costs when using DataSync     For more information, see Configuring transfers with Amazon S3.
    @Sendable
    @inlinable
    public func createLocationS3(_ input: CreateLocationS3Request, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateLocationS3Response {
        try await self.client.execute(
            operation: "CreateLocationS3", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a transfer location for an Amazon S3 bucket. DataSync can use this location as a source or destination for transferring data.  Before you begin, make sure that you read the following topics:    Storage class considerations with Amazon S3 locations     Evaluating S3 request costs when using DataSync     For more information, see Configuring transfers with Amazon S3.
    ///
    /// Parameters:
    ///   - agentArns: (Amazon S3 on Outposts only) Specifies the Amazon Resource Name (ARN) of the DataSync agent on your Outpost. For more information, see Deploy your DataSync agent on Outposts.
    ///   - s3BucketArn: Specifies the ARN of the S3 bucket that you want to use as a location. (When creating your DataSync task later, you specify whether this location is a transfer source or destination.)  If your S3 bucket is located on an Outposts resource, you must specify an Amazon S3 access point. For more information, see Managing data access with Amazon S3 access points in the Amazon S3 User Guide.
    ///   - s3Config: 
    ///   - s3StorageClass: Specifies the storage class that you want your objects to use when Amazon S3 is a transfer destination. For buckets in Amazon Web Services Regions, the storage class defaults to STANDARD. For buckets on Outposts, the storage class defaults to OUTPOSTS. For more information, see Storage class considerations with Amazon S3 transfers.
    ///   - subdirectory: Specifies a prefix in the S3 bucket that DataSync reads from or writes to (depending on whether the bucket is a source or destination location).  DataSync can't transfer objects with a prefix that begins with a slash (/) or includes //, /./, or /../ patterns. For example:    /photos     photos//2006/January     photos/./2006/February     photos/../2006/March
    ///   - tags: Specifies labels that help you categorize, filter, and search for your Amazon Web Services resources. We recommend creating at least a name tag for your transfer location.
    ///   - logger: Logger use during operation
    @inlinable
    public func createLocationS3(
        agentArns: [String]? = nil,
        s3BucketArn: String,
        s3Config: S3Config,
        s3StorageClass: S3StorageClass? = nil,
        subdirectory: String? = nil,
        tags: [TagListEntry]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateLocationS3Response {
        let input = CreateLocationS3Request(
            agentArns: agentArns, 
            s3BucketArn: s3BucketArn, 
            s3Config: s3Config, 
            s3StorageClass: s3StorageClass, 
            subdirectory: subdirectory, 
            tags: tags
        )
        return try await self.createLocationS3(input, logger: logger)
    }

    /// Creates a transfer location for a Server Message Block (SMB) file server. DataSync can use this location as a source or destination for transferring data. Before you begin, make sure that you understand how DataSync accesses SMB file servers. For more information, see Providing DataSync access to SMB file servers.
    @Sendable
    @inlinable
    public func createLocationSmb(_ input: CreateLocationSmbRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateLocationSmbResponse {
        try await self.client.execute(
            operation: "CreateLocationSmb", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a transfer location for a Server Message Block (SMB) file server. DataSync can use this location as a source or destination for transferring data. Before you begin, make sure that you understand how DataSync accesses SMB file servers. For more information, see Providing DataSync access to SMB file servers.
    ///
    /// Parameters:
    ///   - agentArns: Specifies the DataSync agent (or agents) that can connect to your SMB file server. You specify an agent by using its Amazon Resource Name (ARN).
    ///   - authenticationType: Specifies the authentication protocol that DataSync uses to connect to your SMB file server. DataSync supports NTLM (default) and KERBEROS authentication. For more information, see Providing DataSync access to SMB file servers.
    ///   - dnsIpAddresses: Specifies the IPv4 or IPv6 addresses for the DNS servers that your SMB file server belongs to. This parameter applies only if AuthenticationType is set to KERBEROS. If you have multiple domains in your environment, configuring this parameter makes sure that DataSync connects to the right SMB file server.
    ///   - domain: Specifies the Windows domain name that your SMB file server belongs to. This parameter applies only if AuthenticationType is set to NTLM. If you have multiple domains in your environment, configuring this parameter makes sure that DataSync connects to the right file server.
    ///   - kerberosKeytab: Specifies your Kerberos key table (keytab) file, which includes mappings between your Kerberos principal and encryption keys. To avoid task execution errors, make sure that the Kerberos principal that you use to create the keytab file matches exactly what you specify for KerberosPrincipal.
    ///   - kerberosKrb5Conf: Specifies a Kerberos configuration file (krb5.conf) that defines your Kerberos realm configuration. The file must be base64 encoded. If you're using the CLI, the encoding is done for you.
    ///   - kerberosPrincipal: Specifies a Kerberos principal, which is an identity in your Kerberos realm that has permission to access the files, folders, and file metadata in your SMB file server. A Kerberos principal might look like HOST/kerberosuser@MYDOMAIN.ORG. Principal names are case sensitive. Your DataSync task execution will fail if the principal that you specify for this parameter doesn’t exactly match the principal that you use to create the keytab file.
    ///   - mountOptions: Specifies the version of the SMB protocol that DataSync uses to access your SMB file server.
    ///   - password: Specifies the password of the user who can mount your SMB file server and has permission to access the files and folders involved in your transfer. This parameter applies only if AuthenticationType is set to NTLM.
    ///   - serverHostname: Specifies the domain name or IP address (IPv4 or IPv6) of the SMB file server that your DataSync agent connects to.  If you're using Kerberos authentication, you must specify a domain name.
    ///   - subdirectory: Specifies the name of the share exported by your SMB file server where DataSync will read or write data. You can include a subdirectory in the share path (for example, /path/to/subdirectory). Make sure that other SMB clients in your network can also mount this path. To copy all data in the subdirectory, DataSync must be able to mount the SMB share and access all of its data. For more information, see Providing DataSync access to SMB file servers.
    ///   - tags: Specifies labels that help you categorize, filter, and search for your Amazon Web Services resources. We recommend creating at least a name tag for your location.
    ///   - user: Specifies the user that can mount and access the files, folders, and file metadata in your SMB file server. This parameter applies only if AuthenticationType is set to NTLM. For information about choosing a user with the right level of access for your transfer, see Providing DataSync access to SMB file servers.
    ///   - logger: Logger use during operation
    @inlinable
    public func createLocationSmb(
        agentArns: [String],
        authenticationType: SmbAuthenticationType? = nil,
        dnsIpAddresses: [String]? = nil,
        domain: String? = nil,
        kerberosKeytab: AWSBase64Data? = nil,
        kerberosKrb5Conf: AWSBase64Data? = nil,
        kerberosPrincipal: String? = nil,
        mountOptions: SmbMountOptions? = nil,
        password: String? = nil,
        serverHostname: String,
        subdirectory: String,
        tags: [TagListEntry]? = nil,
        user: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateLocationSmbResponse {
        let input = CreateLocationSmbRequest(
            agentArns: agentArns, 
            authenticationType: authenticationType, 
            dnsIpAddresses: dnsIpAddresses, 
            domain: domain, 
            kerberosKeytab: kerberosKeytab, 
            kerberosKrb5Conf: kerberosKrb5Conf, 
            kerberosPrincipal: kerberosPrincipal, 
            mountOptions: mountOptions, 
            password: password, 
            serverHostname: serverHostname, 
            subdirectory: subdirectory, 
            tags: tags, 
            user: user
        )
        return try await self.createLocationSmb(input, logger: logger)
    }

    /// Configures a task, which defines where and how DataSync transfers your data. A task includes a source location, destination location, and transfer options (such as bandwidth limits, scheduling, and more).  If you're planning to transfer data to or from an Amazon S3 location, review how DataSync can affect your S3 request charges and the DataSync pricing page before you begin.
    @Sendable
    @inlinable
    public func createTask(_ input: CreateTaskRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateTaskResponse {
        try await self.client.execute(
            operation: "CreateTask", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Configures a task, which defines where and how DataSync transfers your data. A task includes a source location, destination location, and transfer options (such as bandwidth limits, scheduling, and more).  If you're planning to transfer data to or from an Amazon S3 location, review how DataSync can affect your S3 request charges and the DataSync pricing page before you begin.
    ///
    /// Parameters:
    ///   - cloudWatchLogGroupArn: Specifies the Amazon Resource Name (ARN) of an Amazon CloudWatch log group for monitoring your task. For Enhanced mode tasks, you don't need to specify anything. DataSync automatically sends logs to a CloudWatch log group named /aws/datasync.
    ///   - destinationLocationArn: Specifies the ARN of your transfer's destination location.
    ///   - excludes: Specifies exclude filters that define the files, objects, and folders in your source location that you don't want DataSync to transfer. For more information and examples, see Specifying what DataSync transfers by using filters.
    ///   - includes: Specifies include filters that define the files, objects, and folders in your source location that you want DataSync to transfer. For more information and examples, see Specifying what DataSync transfers by using filters.
    ///   - manifestConfig: Configures a manifest, which is a list of files or objects that you want DataSync to transfer. For more information and configuration examples, see Specifying what DataSync transfers by using a manifest. When using this parameter, your caller identity (the role that you're using DataSync with) must have the iam:PassRole permission. The AWSDataSyncFullAccess policy includes this permission.
    ///   - name: Specifies the name of your task.
    ///   - options: Specifies your task's settings, such as preserving file metadata, verifying data integrity, among other options.
    ///   - schedule: Specifies a schedule for when you want your task to run. For more information, see Scheduling your task.
    ///   - sourceLocationArn: Specifies the ARN of your transfer's source location.
    ///   - tags: Specifies the tags that you want to apply to your task.  Tags are key-value pairs that help you manage, filter, and search for your DataSync resources.
    ///   - taskMode: Specifies one of the following task modes for your data transfer:    ENHANCED - Transfer virtually unlimited numbers of objects with higher performance than Basic mode. Enhanced mode tasks optimize the data transfer process by listing, preparing, transferring, and verifying data in parallel. Enhanced mode is currently available for transfers between Amazon S3 locations, transfers between Azure Blob and Amazon S3 without an agent, and transfers between other clouds and Amazon S3 without an agent.  To create an Enhanced mode task, the IAM role that you use to call the CreateTask operation must have the iam:CreateServiceLinkedRole permission.     BASIC (default) - Transfer files or objects between Amazon Web Services storage and all other supported DataSync locations. Basic mode tasks are subject to quotas on the number of files, objects, and directories in a dataset. Basic mode sequentially prepares, transfers, and verifies data, making it slower than Enhanced mode for most workloads.   For more information, see Understanding task mode differences.
    ///   - taskReportConfig: Specifies how you want to configure a task report, which provides detailed information about your DataSync transfer. For more information, see Monitoring your DataSync transfers with task reports. When using this parameter, your caller identity (the role that you're using DataSync with) must have the iam:PassRole permission. The AWSDataSyncFullAccess policy includes this permission.
    ///   - logger: Logger use during operation
    @inlinable
    public func createTask(
        cloudWatchLogGroupArn: String? = nil,
        destinationLocationArn: String,
        excludes: [FilterRule]? = nil,
        includes: [FilterRule]? = nil,
        manifestConfig: ManifestConfig? = nil,
        name: String? = nil,
        options: Options? = nil,
        schedule: TaskSchedule? = nil,
        sourceLocationArn: String,
        tags: [TagListEntry]? = nil,
        taskMode: TaskMode? = nil,
        taskReportConfig: TaskReportConfig? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateTaskResponse {
        let input = CreateTaskRequest(
            cloudWatchLogGroupArn: cloudWatchLogGroupArn, 
            destinationLocationArn: destinationLocationArn, 
            excludes: excludes, 
            includes: includes, 
            manifestConfig: manifestConfig, 
            name: name, 
            options: options, 
            schedule: schedule, 
            sourceLocationArn: sourceLocationArn, 
            tags: tags, 
            taskMode: taskMode, 
            taskReportConfig: taskReportConfig
        )
        return try await self.createTask(input, logger: logger)
    }

    /// Removes an DataSync agent resource from your Amazon Web Services account. Keep in mind that this operation (which can't be undone) doesn't remove the agent's virtual machine (VM) or Amazon EC2 instance from your storage environment. For next steps, you can delete the VM or instance from your storage environment or reuse it to activate a new agent.
    @Sendable
    @inlinable
    public func deleteAgent(_ input: DeleteAgentRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteAgentResponse {
        try await self.client.execute(
            operation: "DeleteAgent", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Removes an DataSync agent resource from your Amazon Web Services account. Keep in mind that this operation (which can't be undone) doesn't remove the agent's virtual machine (VM) or Amazon EC2 instance from your storage environment. For next steps, you can delete the VM or instance from your storage environment or reuse it to activate a new agent.
    ///
    /// Parameters:
    ///   - agentArn: The Amazon Resource Name (ARN) of the agent to delete. Use the ListAgents operation to return a list of agents for your account and Amazon Web Services Region.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteAgent(
        agentArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteAgentResponse {
        let input = DeleteAgentRequest(
            agentArn: agentArn
        )
        return try await self.deleteAgent(input, logger: logger)
    }

    /// Deletes a transfer location resource from DataSync.
    @Sendable
    @inlinable
    public func deleteLocation(_ input: DeleteLocationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteLocationResponse {
        try await self.client.execute(
            operation: "DeleteLocation", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes a transfer location resource from DataSync.
    ///
    /// Parameters:
    ///   - locationArn: The Amazon Resource Name (ARN) of the location to delete.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteLocation(
        locationArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteLocationResponse {
        let input = DeleteLocationRequest(
            locationArn: locationArn
        )
        return try await self.deleteLocation(input, logger: logger)
    }

    /// Deletes a transfer task resource from DataSync.
    @Sendable
    @inlinable
    public func deleteTask(_ input: DeleteTaskRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteTaskResponse {
        try await self.client.execute(
            operation: "DeleteTask", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes a transfer task resource from DataSync.
    ///
    /// Parameters:
    ///   - taskArn: Specifies the Amazon Resource Name (ARN) of the task that you want to delete.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteTask(
        taskArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteTaskResponse {
        let input = DeleteTaskRequest(
            taskArn: taskArn
        )
        return try await self.deleteTask(input, logger: logger)
    }

    /// Returns information about an DataSync agent, such as its name, service endpoint type, and status.
    @Sendable
    @inlinable
    public func describeAgent(_ input: DescribeAgentRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeAgentResponse {
        try await self.client.execute(
            operation: "DescribeAgent", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns information about an DataSync agent, such as its name, service endpoint type, and status.
    ///
    /// Parameters:
    ///   - agentArn: Specifies the Amazon Resource Name (ARN) of the DataSync agent that you want information about.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeAgent(
        agentArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeAgentResponse {
        let input = DescribeAgentRequest(
            agentArn: agentArn
        )
        return try await self.describeAgent(input, logger: logger)
    }

    /// Provides details about how an DataSync transfer location for Microsoft Azure Blob Storage is configured.
    @Sendable
    @inlinable
    public func describeLocationAzureBlob(_ input: DescribeLocationAzureBlobRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeLocationAzureBlobResponse {
        try await self.client.execute(
            operation: "DescribeLocationAzureBlob", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Provides details about how an DataSync transfer location for Microsoft Azure Blob Storage is configured.
    ///
    /// Parameters:
    ///   - locationArn: Specifies the Amazon Resource Name (ARN) of your Azure Blob Storage transfer location.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeLocationAzureBlob(
        locationArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeLocationAzureBlobResponse {
        let input = DescribeLocationAzureBlobRequest(
            locationArn: locationArn
        )
        return try await self.describeLocationAzureBlob(input, logger: logger)
    }

    /// Provides details about how an DataSync transfer location for an Amazon EFS file system is configured.
    @Sendable
    @inlinable
    public func describeLocationEfs(_ input: DescribeLocationEfsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeLocationEfsResponse {
        try await self.client.execute(
            operation: "DescribeLocationEfs", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Provides details about how an DataSync transfer location for an Amazon EFS file system is configured.
    ///
    /// Parameters:
    ///   - locationArn: The Amazon Resource Name (ARN) of the Amazon EFS file system location that you want information about.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeLocationEfs(
        locationArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeLocationEfsResponse {
        let input = DescribeLocationEfsRequest(
            locationArn: locationArn
        )
        return try await self.describeLocationEfs(input, logger: logger)
    }

    /// Provides details about how an DataSync transfer location for an Amazon FSx for Lustre file system is configured.
    @Sendable
    @inlinable
    public func describeLocationFsxLustre(_ input: DescribeLocationFsxLustreRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeLocationFsxLustreResponse {
        try await self.client.execute(
            operation: "DescribeLocationFsxLustre", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Provides details about how an DataSync transfer location for an Amazon FSx for Lustre file system is configured.
    ///
    /// Parameters:
    ///   - locationArn: The Amazon Resource Name (ARN) of the FSx for Lustre location to describe.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeLocationFsxLustre(
        locationArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeLocationFsxLustreResponse {
        let input = DescribeLocationFsxLustreRequest(
            locationArn: locationArn
        )
        return try await self.describeLocationFsxLustre(input, logger: logger)
    }

    /// Provides details about how an DataSync transfer location for an Amazon FSx for NetApp ONTAP file system is configured.  If your location uses SMB, the DescribeLocationFsxOntap operation doesn't actually return a Password.
    @Sendable
    @inlinable
    public func describeLocationFsxOntap(_ input: DescribeLocationFsxOntapRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeLocationFsxOntapResponse {
        try await self.client.execute(
            operation: "DescribeLocationFsxOntap", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Provides details about how an DataSync transfer location for an Amazon FSx for NetApp ONTAP file system is configured.  If your location uses SMB, the DescribeLocationFsxOntap operation doesn't actually return a Password.
    ///
    /// Parameters:
    ///   - locationArn: Specifies the Amazon Resource Name (ARN) of the FSx for ONTAP file system location that you want information about.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeLocationFsxOntap(
        locationArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeLocationFsxOntapResponse {
        let input = DescribeLocationFsxOntapRequest(
            locationArn: locationArn
        )
        return try await self.describeLocationFsxOntap(input, logger: logger)
    }

    /// Provides details about how an DataSync transfer location for an Amazon FSx for OpenZFS file system is configured.  Response elements related to SMB aren't supported with the DescribeLocationFsxOpenZfs operation.
    @Sendable
    @inlinable
    public func describeLocationFsxOpenZfs(_ input: DescribeLocationFsxOpenZfsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeLocationFsxOpenZfsResponse {
        try await self.client.execute(
            operation: "DescribeLocationFsxOpenZfs", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Provides details about how an DataSync transfer location for an Amazon FSx for OpenZFS file system is configured.  Response elements related to SMB aren't supported with the DescribeLocationFsxOpenZfs operation.
    ///
    /// Parameters:
    ///   - locationArn: The Amazon Resource Name (ARN) of the FSx for OpenZFS location to describe.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeLocationFsxOpenZfs(
        locationArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeLocationFsxOpenZfsResponse {
        let input = DescribeLocationFsxOpenZfsRequest(
            locationArn: locationArn
        )
        return try await self.describeLocationFsxOpenZfs(input, logger: logger)
    }

    /// Provides details about how an DataSync transfer location for an Amazon FSx for Windows File Server file system is configured.
    @Sendable
    @inlinable
    public func describeLocationFsxWindows(_ input: DescribeLocationFsxWindowsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeLocationFsxWindowsResponse {
        try await self.client.execute(
            operation: "DescribeLocationFsxWindows", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Provides details about how an DataSync transfer location for an Amazon FSx for Windows File Server file system is configured.
    ///
    /// Parameters:
    ///   - locationArn: Specifies the Amazon Resource Name (ARN) of the FSx for Windows File Server location.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeLocationFsxWindows(
        locationArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeLocationFsxWindowsResponse {
        let input = DescribeLocationFsxWindowsRequest(
            locationArn: locationArn
        )
        return try await self.describeLocationFsxWindows(input, logger: logger)
    }

    /// Provides details about how an DataSync transfer location for a Hadoop Distributed File System (HDFS) is configured.
    @Sendable
    @inlinable
    public func describeLocationHdfs(_ input: DescribeLocationHdfsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeLocationHdfsResponse {
        try await self.client.execute(
            operation: "DescribeLocationHdfs", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Provides details about how an DataSync transfer location for a Hadoop Distributed File System (HDFS) is configured.
    ///
    /// Parameters:
    ///   - locationArn: Specifies the Amazon Resource Name (ARN) of the HDFS location.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeLocationHdfs(
        locationArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeLocationHdfsResponse {
        let input = DescribeLocationHdfsRequest(
            locationArn: locationArn
        )
        return try await self.describeLocationHdfs(input, logger: logger)
    }

    /// Provides details about how an DataSync transfer location for a Network File System (NFS) file server is configured.
    @Sendable
    @inlinable
    public func describeLocationNfs(_ input: DescribeLocationNfsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeLocationNfsResponse {
        try await self.client.execute(
            operation: "DescribeLocationNfs", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Provides details about how an DataSync transfer location for a Network File System (NFS) file server is configured.
    ///
    /// Parameters:
    ///   - locationArn: Specifies the Amazon Resource Name (ARN) of the NFS location that you want information about.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeLocationNfs(
        locationArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeLocationNfsResponse {
        let input = DescribeLocationNfsRequest(
            locationArn: locationArn
        )
        return try await self.describeLocationNfs(input, logger: logger)
    }

    /// Provides details about how an DataSync transfer location for an object storage system is configured.
    @Sendable
    @inlinable
    public func describeLocationObjectStorage(_ input: DescribeLocationObjectStorageRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeLocationObjectStorageResponse {
        try await self.client.execute(
            operation: "DescribeLocationObjectStorage", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Provides details about how an DataSync transfer location for an object storage system is configured.
    ///
    /// Parameters:
    ///   - locationArn: Specifies the Amazon Resource Name (ARN) of the object storage system location.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeLocationObjectStorage(
        locationArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeLocationObjectStorageResponse {
        let input = DescribeLocationObjectStorageRequest(
            locationArn: locationArn
        )
        return try await self.describeLocationObjectStorage(input, logger: logger)
    }

    /// Provides details about how an DataSync transfer location for an S3 bucket is configured.
    @Sendable
    @inlinable
    public func describeLocationS3(_ input: DescribeLocationS3Request, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeLocationS3Response {
        try await self.client.execute(
            operation: "DescribeLocationS3", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Provides details about how an DataSync transfer location for an S3 bucket is configured.
    ///
    /// Parameters:
    ///   - locationArn: Specifies the Amazon Resource Name (ARN) of the Amazon S3 location.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeLocationS3(
        locationArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeLocationS3Response {
        let input = DescribeLocationS3Request(
            locationArn: locationArn
        )
        return try await self.describeLocationS3(input, logger: logger)
    }

    /// Provides details about how an DataSync transfer location for a Server Message Block (SMB) file server is configured.
    @Sendable
    @inlinable
    public func describeLocationSmb(_ input: DescribeLocationSmbRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeLocationSmbResponse {
        try await self.client.execute(
            operation: "DescribeLocationSmb", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Provides details about how an DataSync transfer location for a Server Message Block (SMB) file server is configured.
    ///
    /// Parameters:
    ///   - locationArn: Specifies the Amazon Resource Name (ARN) of the SMB location that you want information about.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeLocationSmb(
        locationArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeLocationSmbResponse {
        let input = DescribeLocationSmbRequest(
            locationArn: locationArn
        )
        return try await self.describeLocationSmb(input, logger: logger)
    }

    /// Provides information about a task, which defines where and how DataSync transfers your data.
    @Sendable
    @inlinable
    public func describeTask(_ input: DescribeTaskRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeTaskResponse {
        try await self.client.execute(
            operation: "DescribeTask", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Provides information about a task, which defines where and how DataSync transfers your data.
    ///
    /// Parameters:
    ///   - taskArn: Specifies the Amazon Resource Name (ARN) of the transfer task that you want information about.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeTask(
        taskArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeTaskResponse {
        let input = DescribeTaskRequest(
            taskArn: taskArn
        )
        return try await self.describeTask(input, logger: logger)
    }

    /// Provides information about an execution of your DataSync task. You can use this operation to help monitor the progress of an ongoing data transfer or check the results of the transfer.  Some DescribeTaskExecution response elements are only relevant to a specific task mode. For information, see Understanding task mode differences and Understanding data transfer performance counters.
    @Sendable
    @inlinable
    public func describeTaskExecution(_ input: DescribeTaskExecutionRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeTaskExecutionResponse {
        try await self.client.execute(
            operation: "DescribeTaskExecution", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Provides information about an execution of your DataSync task. You can use this operation to help monitor the progress of an ongoing data transfer or check the results of the transfer.  Some DescribeTaskExecution response elements are only relevant to a specific task mode. For information, see Understanding task mode differences and Understanding data transfer performance counters.
    ///
    /// Parameters:
    ///   - taskExecutionArn: Specifies the Amazon Resource Name (ARN) of the task execution that you want information about.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeTaskExecution(
        taskExecutionArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeTaskExecutionResponse {
        let input = DescribeTaskExecutionRequest(
            taskExecutionArn: taskExecutionArn
        )
        return try await self.describeTaskExecution(input, logger: logger)
    }

    /// Returns a list of DataSync agents that belong to an Amazon Web Services account in the Amazon Web Services Region specified in the request. With pagination, you can reduce the number of agents returned in a response. If you get a truncated list of agents in a response, the response contains a marker that you can specify in your next request to fetch the next page of agents.  ListAgents is eventually consistent. This means the result of running the operation might not reflect that you just created or deleted an agent. For example, if you create an agent with CreateAgent and then immediately run ListAgents, that agent might not show up in the list right away. In situations like this, you can always confirm whether an agent has been created (or deleted) by using DescribeAgent.
    @Sendable
    @inlinable
    public func listAgents(_ input: ListAgentsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListAgentsResponse {
        try await self.client.execute(
            operation: "ListAgents", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns a list of DataSync agents that belong to an Amazon Web Services account in the Amazon Web Services Region specified in the request. With pagination, you can reduce the number of agents returned in a response. If you get a truncated list of agents in a response, the response contains a marker that you can specify in your next request to fetch the next page of agents.  ListAgents is eventually consistent. This means the result of running the operation might not reflect that you just created or deleted an agent. For example, if you create an agent with CreateAgent and then immediately run ListAgents, that agent might not show up in the list right away. In situations like this, you can always confirm whether an agent has been created (or deleted) by using DescribeAgent.
    ///
    /// Parameters:
    ///   - maxResults: Specifies the maximum number of DataSync agents to list in a response. By default, a response shows a maximum of 100 agents.
    ///   - nextToken: Specifies an opaque string that indicates the position to begin the next list of results in the response.
    ///   - logger: Logger use during operation
    @inlinable
    public func listAgents(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListAgentsResponse {
        let input = ListAgentsRequest(
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listAgents(input, logger: logger)
    }

    /// Returns a list of source and destination locations. If you have more locations than are returned in a response (that is, the response returns only a truncated list of your agents), the response contains a token that you can specify in your next request to fetch the next page of locations.
    @Sendable
    @inlinable
    public func listLocations(_ input: ListLocationsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListLocationsResponse {
        try await self.client.execute(
            operation: "ListLocations", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns a list of source and destination locations. If you have more locations than are returned in a response (that is, the response returns only a truncated list of your agents), the response contains a token that you can specify in your next request to fetch the next page of locations.
    ///
    /// Parameters:
    ///   - filters: You can use API filters to narrow down the list of resources returned by ListLocations. For example, to retrieve all tasks on a specific source location, you can use ListLocations with filter name LocationType S3 and Operator Equals.
    ///   - maxResults: The maximum number of locations to return.
    ///   - nextToken: An opaque string that indicates the position at which to begin the next list of locations.
    ///   - logger: Logger use during operation
    @inlinable
    public func listLocations(
        filters: [LocationFilter]? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListLocationsResponse {
        let input = ListLocationsRequest(
            filters: filters, 
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listLocations(input, logger: logger)
    }

    /// Returns all the tags associated with an Amazon Web Services resource.
    @Sendable
    @inlinable
    public func listTagsForResource(_ input: ListTagsForResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListTagsForResourceResponse {
        try await self.client.execute(
            operation: "ListTagsForResource", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns all the tags associated with an Amazon Web Services resource.
    ///
    /// Parameters:
    ///   - maxResults: Specifies how many results that you want in the response.
    ///   - nextToken: Specifies an opaque string that indicates the position to begin the next list of results in the response.
    ///   - resourceArn: Specifies the Amazon Resource Name (ARN) of the resource that you want tag information on.
    ///   - logger: Logger use during operation
    @inlinable
    public func listTagsForResource(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        resourceArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListTagsForResourceResponse {
        let input = ListTagsForResourceRequest(
            maxResults: maxResults, 
            nextToken: nextToken, 
            resourceArn: resourceArn
        )
        return try await self.listTagsForResource(input, logger: logger)
    }

    /// Returns a list of executions for an DataSync transfer task.
    @Sendable
    @inlinable
    public func listTaskExecutions(_ input: ListTaskExecutionsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListTaskExecutionsResponse {
        try await self.client.execute(
            operation: "ListTaskExecutions", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns a list of executions for an DataSync transfer task.
    ///
    /// Parameters:
    ///   - maxResults: Specifies how many results you want in the response.
    ///   - nextToken: Specifies an opaque string that indicates the position at which to begin the next list of results in the response.
    ///   - taskArn: Specifies the Amazon Resource Name (ARN) of the task that you want execution information about.
    ///   - logger: Logger use during operation
    @inlinable
    public func listTaskExecutions(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        taskArn: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListTaskExecutionsResponse {
        let input = ListTaskExecutionsRequest(
            maxResults: maxResults, 
            nextToken: nextToken, 
            taskArn: taskArn
        )
        return try await self.listTaskExecutions(input, logger: logger)
    }

    /// Returns a list of the DataSync tasks you created.
    @Sendable
    @inlinable
    public func listTasks(_ input: ListTasksRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListTasksResponse {
        try await self.client.execute(
            operation: "ListTasks", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns a list of the DataSync tasks you created.
    ///
    /// Parameters:
    ///   - filters: You can use API filters to narrow down the list of resources returned by ListTasks. For example, to retrieve all tasks on a specific source location, you can use ListTasks with filter name LocationId and Operator Equals with the ARN for the location.
    ///   - maxResults: The maximum number of tasks to return.
    ///   - nextToken: An opaque string that indicates the position at which to begin the next list of tasks.
    ///   - logger: Logger use during operation
    @inlinable
    public func listTasks(
        filters: [TaskFilter]? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListTasksResponse {
        let input = ListTasksRequest(
            filters: filters, 
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listTasks(input, logger: logger)
    }

    /// Starts an DataSync transfer task. For each task, you can only run one task execution at a time. There are several steps to a task execution. For more information, see Task execution statuses.  If you're planning to transfer data to or from an Amazon S3 location, review how DataSync can affect your S3 request charges and the DataSync pricing page before you begin.
    @Sendable
    @inlinable
    public func startTaskExecution(_ input: StartTaskExecutionRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> StartTaskExecutionResponse {
        try await self.client.execute(
            operation: "StartTaskExecution", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Starts an DataSync transfer task. For each task, you can only run one task execution at a time. There are several steps to a task execution. For more information, see Task execution statuses.  If you're planning to transfer data to or from an Amazon S3 location, review how DataSync can affect your S3 request charges and the DataSync pricing page before you begin.
    ///
    /// Parameters:
    ///   - excludes: Specifies a list of filter rules that determines which files to exclude from a task. The list contains a single filter string that consists of the patterns to exclude. The patterns are delimited by "|" (that is, a pipe), for example, "/folder1|/folder2".
    ///   - includes: Specifies a list of filter rules that determines which files to include when running a task. The pattern should contain a single filter string that consists of the patterns to include. The patterns are delimited by "|" (that is, a pipe), for example, "/folder1|/folder2".
    ///   - manifestConfig: Configures a manifest, which is a list of files or objects that you want DataSync to transfer. For more information and configuration examples, see Specifying what DataSync transfers by using a manifest. When using this parameter, your caller identity (the role that you're using DataSync with) must have the iam:PassRole permission. The AWSDataSyncFullAccess policy includes this permission. To remove a manifest configuration, specify this parameter with an empty value.
    ///   - overrideOptions: 
    ///   - tags: Specifies the tags that you want to apply to the Amazon Resource Name (ARN) representing the task execution.  Tags are key-value pairs that help you manage, filter, and search for your DataSync resources.
    ///   - taskArn: Specifies the Amazon Resource Name (ARN) of the task that you want to start.
    ///   - taskReportConfig: Specifies how you want to configure a task report, which provides detailed information about your DataSync transfer. For more information, see Monitoring your DataSync transfers with task reports. When using this parameter, your caller identity (the role that you're using DataSync with) must have the iam:PassRole permission. The AWSDataSyncFullAccess policy includes this permission. To remove a task report configuration, specify this parameter as empty.
    ///   - logger: Logger use during operation
    @inlinable
    public func startTaskExecution(
        excludes: [FilterRule]? = nil,
        includes: [FilterRule]? = nil,
        manifestConfig: ManifestConfig? = nil,
        overrideOptions: Options? = nil,
        tags: [TagListEntry]? = nil,
        taskArn: String,
        taskReportConfig: TaskReportConfig? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> StartTaskExecutionResponse {
        let input = StartTaskExecutionRequest(
            excludes: excludes, 
            includes: includes, 
            manifestConfig: manifestConfig, 
            overrideOptions: overrideOptions, 
            tags: tags, 
            taskArn: taskArn, 
            taskReportConfig: taskReportConfig
        )
        return try await self.startTaskExecution(input, logger: logger)
    }

    /// Applies a tag to an Amazon Web Services resource. Tags are key-value pairs that can help you manage, filter, and search for your resources. These include DataSync resources, such as locations, tasks, and task executions.
    @Sendable
    @inlinable
    public func tagResource(_ input: TagResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> TagResourceResponse {
        try await self.client.execute(
            operation: "TagResource", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Applies a tag to an Amazon Web Services resource. Tags are key-value pairs that can help you manage, filter, and search for your resources. These include DataSync resources, such as locations, tasks, and task executions.
    ///
    /// Parameters:
    ///   - resourceArn: Specifies the Amazon Resource Name (ARN) of the resource to apply the tag to.
    ///   - tags: Specifies the tags that you want to apply to the resource.
    ///   - logger: Logger use during operation
    @inlinable
    public func tagResource(
        resourceArn: String,
        tags: [TagListEntry],
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> TagResourceResponse {
        let input = TagResourceRequest(
            resourceArn: resourceArn, 
            tags: tags
        )
        return try await self.tagResource(input, logger: logger)
    }

    /// Removes tags from an Amazon Web Services resource.
    @Sendable
    @inlinable
    public func untagResource(_ input: UntagResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UntagResourceResponse {
        try await self.client.execute(
            operation: "UntagResource", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Removes tags from an Amazon Web Services resource.
    ///
    /// Parameters:
    ///   - keys: Specifies the keys in the tags that you want to remove.
    ///   - resourceArn: Specifies the Amazon Resource Name (ARN) of the resource to remove the tags from.
    ///   - logger: Logger use during operation
    @inlinable
    public func untagResource(
        keys: [String],
        resourceArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UntagResourceResponse {
        let input = UntagResourceRequest(
            keys: keys, 
            resourceArn: resourceArn
        )
        return try await self.untagResource(input, logger: logger)
    }

    /// Updates the name of an DataSync agent.
    @Sendable
    @inlinable
    public func updateAgent(_ input: UpdateAgentRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateAgentResponse {
        try await self.client.execute(
            operation: "UpdateAgent", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates the name of an DataSync agent.
    ///
    /// Parameters:
    ///   - agentArn: The Amazon Resource Name (ARN) of the agent to update.
    ///   - name: The name that you want to use to configure the agent.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateAgent(
        agentArn: String,
        name: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateAgentResponse {
        let input = UpdateAgentRequest(
            agentArn: agentArn, 
            name: name
        )
        return try await self.updateAgent(input, logger: logger)
    }

    /// Modifies the following configurations of the Microsoft Azure Blob Storage transfer location that you're using with DataSync. For more information, see Configuring DataSync transfers with Azure Blob Storage.
    @Sendable
    @inlinable
    public func updateLocationAzureBlob(_ input: UpdateLocationAzureBlobRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateLocationAzureBlobResponse {
        try await self.client.execute(
            operation: "UpdateLocationAzureBlob", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Modifies the following configurations of the Microsoft Azure Blob Storage transfer location that you're using with DataSync. For more information, see Configuring DataSync transfers with Azure Blob Storage.
    ///
    /// Parameters:
    ///   - accessTier: Specifies the access tier that you want your objects or files transferred into. This only applies when using the location as a transfer destination. For more information, see Access tiers.
    ///   - agentArns: (Optional) Specifies the Amazon Resource Name (ARN) of the DataSync agent that can connect with your Azure Blob Storage container. If you are setting up an agentless cross-cloud transfer, you do not need to specify a value for this parameter. You can specify more than one agent. For more information, see Using multiple agents for your transfer.  You cannot add or remove agents from a storage location after you initially create it.
    ///   - authenticationType: Specifies the authentication method DataSync uses to access your Azure Blob Storage. DataSync can access blob storage using a shared access signature (SAS).
    ///   - blobType: Specifies the type of blob that you want your objects or files to be when transferring them into Azure Blob Storage. Currently, DataSync only supports moving data into Azure Blob Storage as block blobs. For more information on blob types, see the Azure Blob Storage documentation.
    ///   - cmkSecretConfig: Specifies configuration information for a DataSync-managed secret, such as an authentication token or set of credentials that DataSync uses to access a specific transfer location, and a customer-managed KMS key.
    ///   - customSecretConfig: Specifies configuration information for a customer-managed secret, such as an authentication token or set of credentials that DataSync uses to access a specific transfer location, and a customer-managed KMS key.
    ///   - locationArn: Specifies the ARN of the Azure Blob Storage transfer location that you're updating.
    ///   - sasConfiguration: Specifies the SAS configuration that allows DataSync to access your Azure Blob Storage.
    ///   - subdirectory: Specifies path segments if you want to limit your transfer to a virtual directory in your container (for example, /my/images).
    ///   - logger: Logger use during operation
    @inlinable
    public func updateLocationAzureBlob(
        accessTier: AzureAccessTier? = nil,
        agentArns: [String]? = nil,
        authenticationType: AzureBlobAuthenticationType? = nil,
        blobType: AzureBlobType? = nil,
        cmkSecretConfig: CmkSecretConfig? = nil,
        customSecretConfig: CustomSecretConfig? = nil,
        locationArn: String,
        sasConfiguration: AzureBlobSasConfiguration? = nil,
        subdirectory: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateLocationAzureBlobResponse {
        let input = UpdateLocationAzureBlobRequest(
            accessTier: accessTier, 
            agentArns: agentArns, 
            authenticationType: authenticationType, 
            blobType: blobType, 
            cmkSecretConfig: cmkSecretConfig, 
            customSecretConfig: customSecretConfig, 
            locationArn: locationArn, 
            sasConfiguration: sasConfiguration, 
            subdirectory: subdirectory
        )
        return try await self.updateLocationAzureBlob(input, logger: logger)
    }

    /// Modifies the following configuration parameters of the Amazon EFS transfer location that you're using with DataSync. For more information, see Configuring DataSync transfers with Amazon EFS.
    @Sendable
    @inlinable
    public func updateLocationEfs(_ input: UpdateLocationEfsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateLocationEfsResponse {
        try await self.client.execute(
            operation: "UpdateLocationEfs", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Modifies the following configuration parameters of the Amazon EFS transfer location that you're using with DataSync. For more information, see Configuring DataSync transfers with Amazon EFS.
    ///
    /// Parameters:
    ///   - accessPointArn: Specifies the Amazon Resource Name (ARN) of the access point that DataSync uses to mount your Amazon EFS file system. For more information, see Accessing restricted Amazon EFS file systems.
    ///   - fileSystemAccessRoleArn: Specifies an Identity and Access Management (IAM) role that allows DataSync to access your Amazon EFS file system. For information on creating this role, see Creating a DataSync IAM role for Amazon EFS file system access.
    ///   - inTransitEncryption: Specifies whether you want DataSync to use Transport Layer Security (TLS) 1.2 encryption when it transfers data to or from your Amazon EFS file system. If you specify an access point using AccessPointArn or an IAM role using FileSystemAccessRoleArn, you must set this parameter to TLS1_2.
    ///   - locationArn: Specifies the Amazon Resource Name (ARN) of the Amazon EFS transfer location that you're updating.
    ///   - subdirectory: Specifies a mount path for your Amazon EFS file system. This is where DataSync reads or writes data on your file system (depending on if this is a source or destination location). By default, DataSync uses the root directory (or access point if you provide one by using AccessPointArn). You can also include subdirectories using forward slashes (for example, /path/to/folder).
    ///   - logger: Logger use during operation
    @inlinable
    public func updateLocationEfs(
        accessPointArn: String? = nil,
        fileSystemAccessRoleArn: String? = nil,
        inTransitEncryption: EfsInTransitEncryption? = nil,
        locationArn: String,
        subdirectory: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateLocationEfsResponse {
        let input = UpdateLocationEfsRequest(
            accessPointArn: accessPointArn, 
            fileSystemAccessRoleArn: fileSystemAccessRoleArn, 
            inTransitEncryption: inTransitEncryption, 
            locationArn: locationArn, 
            subdirectory: subdirectory
        )
        return try await self.updateLocationEfs(input, logger: logger)
    }

    /// Modifies the following configuration parameters of the Amazon FSx for Lustre transfer location that you're using with DataSync. For more information, see Configuring DataSync transfers with FSx for Lustre.
    @Sendable
    @inlinable
    public func updateLocationFsxLustre(_ input: UpdateLocationFsxLustreRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateLocationFsxLustreResponse {
        try await self.client.execute(
            operation: "UpdateLocationFsxLustre", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Modifies the following configuration parameters of the Amazon FSx for Lustre transfer location that you're using with DataSync. For more information, see Configuring DataSync transfers with FSx for Lustre.
    ///
    /// Parameters:
    ///   - locationArn: Specifies the Amazon Resource Name (ARN) of the FSx for Lustre transfer location that you're updating.
    ///   - subdirectory: Specifies a mount path for your FSx for Lustre file system. The path can include subdirectories. When the location is used as a source, DataSync reads data from the mount path. When the location is used as a destination, DataSync writes data to the mount path. If you don't include this parameter, DataSync uses the file system's root directory (/).
    ///   - logger: Logger use during operation
    @inlinable
    public func updateLocationFsxLustre(
        locationArn: String,
        subdirectory: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateLocationFsxLustreResponse {
        let input = UpdateLocationFsxLustreRequest(
            locationArn: locationArn, 
            subdirectory: subdirectory
        )
        return try await self.updateLocationFsxLustre(input, logger: logger)
    }

    /// Modifies the following configuration parameters of the Amazon FSx for NetApp ONTAP transfer location that you're using with DataSync. For more information, see Configuring DataSync transfers with FSx for ONTAP.
    @Sendable
    @inlinable
    public func updateLocationFsxOntap(_ input: UpdateLocationFsxOntapRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateLocationFsxOntapResponse {
        try await self.client.execute(
            operation: "UpdateLocationFsxOntap", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Modifies the following configuration parameters of the Amazon FSx for NetApp ONTAP transfer location that you're using with DataSync. For more information, see Configuring DataSync transfers with FSx for ONTAP.
    ///
    /// Parameters:
    ///   - locationArn: Specifies the Amazon Resource Name (ARN) of the FSx for ONTAP transfer location that you're updating.
    ///   - protocol: Specifies the data transfer protocol that DataSync uses to access your Amazon FSx file system.
    ///   - subdirectory: Specifies a path to the file share in the storage virtual machine (SVM) where you want to transfer data to or from. You can specify a junction path (also known as a mount point), qtree path (for NFS file shares), or share name (for SMB file shares). For example, your mount path might be /vol1, /vol1/tree1, or /share1.  Don't specify a junction path in the SVM's root volume. For more information, see Managing FSx for ONTAP storage virtual machines in the Amazon FSx for NetApp ONTAP User Guide.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateLocationFsxOntap(
        locationArn: String,
        protocol: FsxUpdateProtocol? = nil,
        subdirectory: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateLocationFsxOntapResponse {
        let input = UpdateLocationFsxOntapRequest(
            locationArn: locationArn, 
            protocol: `protocol`, 
            subdirectory: subdirectory
        )
        return try await self.updateLocationFsxOntap(input, logger: logger)
    }

    /// Modifies the following configuration parameters of the Amazon FSx for OpenZFS transfer location that you're using with DataSync. For more information, see Configuring DataSync transfers with FSx for OpenZFS.  Request parameters related to SMB aren't supported with the UpdateLocationFsxOpenZfs operation.
    @Sendable
    @inlinable
    public func updateLocationFsxOpenZfs(_ input: UpdateLocationFsxOpenZfsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateLocationFsxOpenZfsResponse {
        try await self.client.execute(
            operation: "UpdateLocationFsxOpenZfs", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Modifies the following configuration parameters of the Amazon FSx for OpenZFS transfer location that you're using with DataSync. For more information, see Configuring DataSync transfers with FSx for OpenZFS.  Request parameters related to SMB aren't supported with the UpdateLocationFsxOpenZfs operation.
    ///
    /// Parameters:
    ///   - locationArn: Specifies the Amazon Resource Name (ARN) of the FSx for OpenZFS transfer location that you're updating.
    ///   - protocol: 
    ///   - subdirectory: Specifies a subdirectory in the location's path that must begin with /fsx. DataSync uses this subdirectory to read or write data (depending on whether the file system is a source or destination location).
    ///   - logger: Logger use during operation
    @inlinable
    public func updateLocationFsxOpenZfs(
        locationArn: String,
        protocol: FsxProtocol? = nil,
        subdirectory: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateLocationFsxOpenZfsResponse {
        let input = UpdateLocationFsxOpenZfsRequest(
            locationArn: locationArn, 
            protocol: `protocol`, 
            subdirectory: subdirectory
        )
        return try await self.updateLocationFsxOpenZfs(input, logger: logger)
    }

    /// Modifies the following configuration parameters of the Amazon FSx for Windows File Server transfer location that you're using with DataSync. For more information, see Configuring DataSync transfers with FSx for Windows File Server.
    @Sendable
    @inlinable
    public func updateLocationFsxWindows(_ input: UpdateLocationFsxWindowsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateLocationFsxWindowsResponse {
        try await self.client.execute(
            operation: "UpdateLocationFsxWindows", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Modifies the following configuration parameters of the Amazon FSx for Windows File Server transfer location that you're using with DataSync. For more information, see Configuring DataSync transfers with FSx for Windows File Server.
    ///
    /// Parameters:
    ///   - domain: Specifies the name of the Windows domain that your FSx for Windows File Server file system belongs to. If you have multiple Active Directory domains in your environment, configuring this parameter makes sure that DataSync connects to the right file system.
    ///   - locationArn: Specifies the ARN of the FSx for Windows File Server transfer location that you're updating.
    ///   - password: Specifies the password of the user with the permissions to mount and access the files, folders, and file metadata in your FSx for Windows File Server file system.
    ///   - subdirectory: Specifies a mount path for your file system using forward slashes. DataSync uses this subdirectory to read or write data (depending on whether the file system is a source or destination location).
    ///   - user: Specifies the user with the permissions to mount and access the files, folders, and file metadata in your FSx for Windows File Server file system. For information about choosing a user with the right level of access for your transfer, see required permissions for FSx for Windows File Server locations.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateLocationFsxWindows(
        domain: String? = nil,
        locationArn: String,
        password: String? = nil,
        subdirectory: String? = nil,
        user: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateLocationFsxWindowsResponse {
        let input = UpdateLocationFsxWindowsRequest(
            domain: domain, 
            locationArn: locationArn, 
            password: password, 
            subdirectory: subdirectory, 
            user: user
        )
        return try await self.updateLocationFsxWindows(input, logger: logger)
    }

    /// Modifies the following configuration parameters of the Hadoop Distributed File System (HDFS) transfer location that you're using with DataSync. For more information, see Configuring DataSync transfers with an HDFS cluster.
    @Sendable
    @inlinable
    public func updateLocationHdfs(_ input: UpdateLocationHdfsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateLocationHdfsResponse {
        try await self.client.execute(
            operation: "UpdateLocationHdfs", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Modifies the following configuration parameters of the Hadoop Distributed File System (HDFS) transfer location that you're using with DataSync. For more information, see Configuring DataSync transfers with an HDFS cluster.
    ///
    /// Parameters:
    ///   - agentArns: The Amazon Resource Names (ARNs) of the DataSync agents that can connect to your HDFS cluster.
    ///   - authenticationType: The type of authentication used to determine the identity of the user.
    ///   - blockSize: The size of the data blocks to write into the HDFS cluster.
    ///   - kerberosKeytab: The Kerberos key table (keytab) that contains mappings between the defined Kerberos principal and the encrypted keys. You can load the keytab from a file by providing the file's address.
    ///   - kerberosKrb5Conf: The krb5.conf file that contains the Kerberos configuration information. You can load the krb5.conf file by providing the file's address. If you're using the CLI, it performs the base64 encoding for you. Otherwise, provide the base64-encoded text.
    ///   - kerberosPrincipal: The Kerberos principal with access to the files and folders on the HDFS cluster.
    ///   - kmsKeyProviderUri: The URI of the HDFS cluster's Key Management Server (KMS).
    ///   - locationArn: The Amazon Resource Name (ARN) of the source HDFS cluster location.
    ///   - nameNodes: The NameNode that manages the HDFS namespace. The NameNode performs operations such as opening, closing, and renaming files and directories. The NameNode contains the information to map blocks of data to the DataNodes. You can use only one NameNode.
    ///   - qopConfiguration: The Quality of Protection (QOP) configuration specifies the Remote Procedure Call (RPC) and data transfer privacy settings configured on the Hadoop Distributed File System (HDFS) cluster.
    ///   - replicationFactor: The number of DataNodes to replicate the data to when writing to the HDFS cluster.
    ///   - simpleUser: The user name used to identify the client on the host operating system.
    ///   - subdirectory: A subdirectory in the HDFS cluster. This subdirectory is used to read data from or write data to the HDFS cluster.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateLocationHdfs(
        agentArns: [String]? = nil,
        authenticationType: HdfsAuthenticationType? = nil,
        blockSize: Int? = nil,
        kerberosKeytab: AWSBase64Data? = nil,
        kerberosKrb5Conf: AWSBase64Data? = nil,
        kerberosPrincipal: String? = nil,
        kmsKeyProviderUri: String? = nil,
        locationArn: String,
        nameNodes: [HdfsNameNode]? = nil,
        qopConfiguration: QopConfiguration? = nil,
        replicationFactor: Int? = nil,
        simpleUser: String? = nil,
        subdirectory: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateLocationHdfsResponse {
        let input = UpdateLocationHdfsRequest(
            agentArns: agentArns, 
            authenticationType: authenticationType, 
            blockSize: blockSize, 
            kerberosKeytab: kerberosKeytab, 
            kerberosKrb5Conf: kerberosKrb5Conf, 
            kerberosPrincipal: kerberosPrincipal, 
            kmsKeyProviderUri: kmsKeyProviderUri, 
            locationArn: locationArn, 
            nameNodes: nameNodes, 
            qopConfiguration: qopConfiguration, 
            replicationFactor: replicationFactor, 
            simpleUser: simpleUser, 
            subdirectory: subdirectory
        )
        return try await self.updateLocationHdfs(input, logger: logger)
    }

    /// Modifies the following configuration parameters of the Network File System (NFS) transfer location that you're using with DataSync. For more information, see Configuring transfers with an NFS file server.
    @Sendable
    @inlinable
    public func updateLocationNfs(_ input: UpdateLocationNfsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateLocationNfsResponse {
        try await self.client.execute(
            operation: "UpdateLocationNfs", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Modifies the following configuration parameters of the Network File System (NFS) transfer location that you're using with DataSync. For more information, see Configuring transfers with an NFS file server.
    ///
    /// Parameters:
    ///   - locationArn: Specifies the Amazon Resource Name (ARN) of the NFS transfer location that you want to update.
    ///   - mountOptions: 
    ///   - onPremConfig: 
    ///   - serverHostname: Specifies the DNS name or IP address (IPv4 or IPv6) of the NFS file server that your DataSync agent connects to.
    ///   - subdirectory: Specifies the export path in your NFS file server that you want DataSync to mount. This path (or a subdirectory of the path) is where DataSync transfers data to or from. For information on configuring an export for DataSync, see Accessing NFS file servers.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateLocationNfs(
        locationArn: String,
        mountOptions: NfsMountOptions? = nil,
        onPremConfig: OnPremConfig? = nil,
        serverHostname: String? = nil,
        subdirectory: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateLocationNfsResponse {
        let input = UpdateLocationNfsRequest(
            locationArn: locationArn, 
            mountOptions: mountOptions, 
            onPremConfig: onPremConfig, 
            serverHostname: serverHostname, 
            subdirectory: subdirectory
        )
        return try await self.updateLocationNfs(input, logger: logger)
    }

    /// Modifies the following configuration parameters of the object storage transfer location that you're using with DataSync. For more information, see Configuring DataSync transfers with an object storage system.
    @Sendable
    @inlinable
    public func updateLocationObjectStorage(_ input: UpdateLocationObjectStorageRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateLocationObjectStorageResponse {
        try await self.client.execute(
            operation: "UpdateLocationObjectStorage", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Modifies the following configuration parameters of the object storage transfer location that you're using with DataSync. For more information, see Configuring DataSync transfers with an object storage system.
    ///
    /// Parameters:
    ///   - accessKey: Specifies the access key (for example, a user name) if credentials are required to authenticate with the object storage server.
    ///   - agentArns: (Optional) Specifies the Amazon Resource Names (ARNs) of the DataSync agents that can connect with your object storage system. If you are setting up an agentless cross-cloud transfer, you do not need to specify a value for this parameter.  You cannot add or remove agents from a storage location after you initially create it.
    ///   - cmkSecretConfig: Specifies configuration information for a DataSync-managed secret, such as an authentication token or set of credentials that DataSync uses to access a specific transfer location, and a customer-managed KMS key.
    ///   - customSecretConfig: Specifies configuration information for a customer-managed secret, such as an authentication token or set of credentials that DataSync uses to access a specific transfer location, and a customer-managed KMS key.
    ///   - locationArn: Specifies the ARN of the object storage system location that you're updating.
    ///   - secretKey: Specifies the secret key (for example, a password) if credentials are required to authenticate with the object storage server.  If you provide a secret using SecretKey, but do not provide secret configuration details using CmkSecretConfig or CustomSecretConfig, then DataSync stores the token using your Amazon Web Services account's Secrets Manager secret.
    ///   - serverCertificate: Specifies a certificate chain for DataSync to authenticate with your object storage system if the system uses a private or self-signed certificate authority (CA). You must specify a single .pem file with a full certificate chain (for example, file:///home/user/.ssh/object_storage_certificates.pem). The certificate chain might include:   The object storage system's certificate   All intermediate certificates (if there are any)   The root certificate of the signing CA   You can concatenate your certificates into a .pem file (which can be up to 32768 bytes before base64 encoding). The following example cat command creates an object_storage_certificates.pem file that includes three certificates:  cat object_server_certificate.pem intermediate_certificate.pem ca_root_certificate.pem > object_storage_certificates.pem  To use this parameter, configure ServerProtocol to HTTPS. Updating this parameter doesn't interfere with tasks that you have in progress.
    ///   - serverHostname: Specifies the domain name or IP address (IPv4 or IPv6) of the object storage server that your DataSync agent connects to.
    ///   - serverPort: Specifies the port that your object storage server accepts inbound network traffic on (for example, port 443).
    ///   - serverProtocol: Specifies the protocol that your object storage server uses to communicate.
    ///   - subdirectory: Specifies the object prefix for your object storage server. If this is a source location, DataSync only copies objects with this prefix. If this is a destination location, DataSync writes all objects with this prefix.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateLocationObjectStorage(
        accessKey: String? = nil,
        agentArns: [String]? = nil,
        cmkSecretConfig: CmkSecretConfig? = nil,
        customSecretConfig: CustomSecretConfig? = nil,
        locationArn: String,
        secretKey: String? = nil,
        serverCertificate: AWSBase64Data? = nil,
        serverHostname: String? = nil,
        serverPort: Int? = nil,
        serverProtocol: ObjectStorageServerProtocol? = nil,
        subdirectory: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateLocationObjectStorageResponse {
        let input = UpdateLocationObjectStorageRequest(
            accessKey: accessKey, 
            agentArns: agentArns, 
            cmkSecretConfig: cmkSecretConfig, 
            customSecretConfig: customSecretConfig, 
            locationArn: locationArn, 
            secretKey: secretKey, 
            serverCertificate: serverCertificate, 
            serverHostname: serverHostname, 
            serverPort: serverPort, 
            serverProtocol: serverProtocol, 
            subdirectory: subdirectory
        )
        return try await self.updateLocationObjectStorage(input, logger: logger)
    }

    /// Modifies the following configuration parameters of the Amazon S3 transfer location that you're using with DataSync.  Before you begin, make sure that you read the following topics:    Storage class considerations with Amazon S3 locations     Evaluating S3 request costs when using DataSync
    @Sendable
    @inlinable
    public func updateLocationS3(_ input: UpdateLocationS3Request, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateLocationS3Response {
        try await self.client.execute(
            operation: "UpdateLocationS3", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Modifies the following configuration parameters of the Amazon S3 transfer location that you're using with DataSync.  Before you begin, make sure that you read the following topics:    Storage class considerations with Amazon S3 locations     Evaluating S3 request costs when using DataSync
    ///
    /// Parameters:
    ///   - locationArn: Specifies the Amazon Resource Name (ARN) of the Amazon S3 transfer location that you're updating.
    ///   - s3Config: 
    ///   - s3StorageClass: Specifies the storage class that you want your objects to use when Amazon S3 is a transfer destination. For buckets in Amazon Web Services Regions, the storage class defaults to STANDARD. For buckets on Outposts, the storage class defaults to OUTPOSTS. For more information, see Storage class considerations with Amazon S3 transfers.
    ///   - subdirectory: Specifies a prefix in the S3 bucket that DataSync reads from or writes to (depending on whether the bucket is a source or destination location).  DataSync can't transfer objects with a prefix that begins with a slash (/) or includes //, /./, or /../ patterns. For example:    /photos     photos//2006/January     photos/./2006/February     photos/../2006/March
    ///   - logger: Logger use during operation
    @inlinable
    public func updateLocationS3(
        locationArn: String,
        s3Config: S3Config? = nil,
        s3StorageClass: S3StorageClass? = nil,
        subdirectory: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateLocationS3Response {
        let input = UpdateLocationS3Request(
            locationArn: locationArn, 
            s3Config: s3Config, 
            s3StorageClass: s3StorageClass, 
            subdirectory: subdirectory
        )
        return try await self.updateLocationS3(input, logger: logger)
    }

    /// Modifies the following configuration parameters of the Server Message Block (SMB) transfer location that you're using with DataSync. For more information, see Configuring DataSync transfers with an SMB file server.
    @Sendable
    @inlinable
    public func updateLocationSmb(_ input: UpdateLocationSmbRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateLocationSmbResponse {
        try await self.client.execute(
            operation: "UpdateLocationSmb", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Modifies the following configuration parameters of the Server Message Block (SMB) transfer location that you're using with DataSync. For more information, see Configuring DataSync transfers with an SMB file server.
    ///
    /// Parameters:
    ///   - agentArns: Specifies the DataSync agent (or agents) that can connect to your SMB file server. You specify an agent by using its Amazon Resource Name (ARN).
    ///   - authenticationType: Specifies the authentication protocol that DataSync uses to connect to your SMB file server. DataSync supports NTLM (default) and KERBEROS authentication. For more information, see Providing DataSync access to SMB file servers.
    ///   - dnsIpAddresses: Specifies the IP addresses (IPv4 or IPv6) for the DNS servers that your SMB file server belongs to. This parameter applies only if AuthenticationType is set to KERBEROS. If you have multiple domains in your environment, configuring this parameter makes sure that DataSync connects to the right SMB file server.
    ///   - domain: Specifies the Windows domain name that your SMB file server belongs to. This parameter applies only if AuthenticationType is set to NTLM. If you have multiple domains in your environment, configuring this parameter makes sure that DataSync connects to the right file server.
    ///   - kerberosKeytab: Specifies your Kerberos key table (keytab) file, which includes mappings between your Kerberos principal and encryption keys. To avoid task execution errors, make sure that the Kerberos principal that you use to create the keytab file matches exactly what you specify for KerberosPrincipal.
    ///   - kerberosKrb5Conf: Specifies a Kerberos configuration file (krb5.conf) that defines your Kerberos realm configuration. The file must be base64 encoded. If you're using the CLI, the encoding is done for you.
    ///   - kerberosPrincipal: Specifies a Kerberos prinicpal, which is an identity in your Kerberos realm that has permission to access the files, folders, and file metadata in your SMB file server. A Kerberos principal might look like HOST/kerberosuser@MYDOMAIN.ORG. Principal names are case sensitive. Your DataSync task execution will fail if the principal that you specify for this parameter doesn’t exactly match the principal that you use to create the keytab file.
    ///   - locationArn: Specifies the ARN of the SMB location that you want to update.
    ///   - mountOptions: 
    ///   - password: Specifies the password of the user who can mount your SMB file server and has permission to access the files and folders involved in your transfer. This parameter applies only if AuthenticationType is set to NTLM.
    ///   - serverHostname: Specifies the domain name or IP address (IPv4 or IPv6) of the SMB file server that your DataSync agent connects to.  If you're using Kerberos authentication, you must specify a domain name.
    ///   - subdirectory: Specifies the name of the share exported by your SMB file server where DataSync will read or write data. You can include a subdirectory in the share path (for example, /path/to/subdirectory). Make sure that other SMB clients in your network can also mount this path. To copy all data in the specified subdirectory, DataSync must be able to mount the SMB share and access all of its data. For more information, see Providing DataSync access to SMB file servers.
    ///   - user: Specifies the user name that can mount your SMB file server and has permission to access the files and folders involved in your transfer. This parameter applies only if AuthenticationType is set to NTLM. For information about choosing a user with the right level of access for your transfer, see Providing DataSync access to SMB file servers.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateLocationSmb(
        agentArns: [String]? = nil,
        authenticationType: SmbAuthenticationType? = nil,
        dnsIpAddresses: [String]? = nil,
        domain: String? = nil,
        kerberosKeytab: AWSBase64Data? = nil,
        kerberosKrb5Conf: AWSBase64Data? = nil,
        kerberosPrincipal: String? = nil,
        locationArn: String,
        mountOptions: SmbMountOptions? = nil,
        password: String? = nil,
        serverHostname: String? = nil,
        subdirectory: String? = nil,
        user: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateLocationSmbResponse {
        let input = UpdateLocationSmbRequest(
            agentArns: agentArns, 
            authenticationType: authenticationType, 
            dnsIpAddresses: dnsIpAddresses, 
            domain: domain, 
            kerberosKeytab: kerberosKeytab, 
            kerberosKrb5Conf: kerberosKrb5Conf, 
            kerberosPrincipal: kerberosPrincipal, 
            locationArn: locationArn, 
            mountOptions: mountOptions, 
            password: password, 
            serverHostname: serverHostname, 
            subdirectory: subdirectory, 
            user: user
        )
        return try await self.updateLocationSmb(input, logger: logger)
    }

    /// Updates the configuration of a task, which defines where and how DataSync transfers your data.
    @Sendable
    @inlinable
    public func updateTask(_ input: UpdateTaskRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateTaskResponse {
        try await self.client.execute(
            operation: "UpdateTask", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates the configuration of a task, which defines where and how DataSync transfers your data.
    ///
    /// Parameters:
    ///   - cloudWatchLogGroupArn: Specifies the Amazon Resource Name (ARN) of an Amazon CloudWatch log group for monitoring your task. For Enhanced mode tasks, you must use /aws/datasync as your log group name. For example:  arn:aws:logs:us-east-1:111222333444:log-group:/aws/datasync:*  For more information, see Monitoring data transfers with CloudWatch Logs.
    ///   - excludes: Specifies exclude filters that define the files, objects, and folders in your source location that you don't want DataSync to transfer. For more information and examples, see Specifying what DataSync transfers by using filters.
    ///   - includes: Specifies include filters define the files, objects, and folders in your source location that you want DataSync to transfer. For more information and examples, see Specifying what DataSync transfers by using filters.
    ///   - manifestConfig: Configures a manifest, which is a list of files or objects that you want DataSync to transfer. For more information and configuration examples, see Specifying what DataSync transfers by using a manifest. When using this parameter, your caller identity (the IAM role that you're using DataSync with) must have the iam:PassRole permission. The AWSDataSyncFullAccess policy includes this permission. To remove a manifest configuration, specify this parameter as empty.
    ///   - name: Specifies the name of your task.
    ///   - options: 
    ///   - schedule: Specifies a schedule for when you want your task to run. For more information, see Scheduling your task.
    ///   - taskArn: Specifies the ARN of the task that you want to update.
    ///   - taskReportConfig: Specifies how you want to configure a task report, which provides detailed information about your DataSync transfer. For more information, see Monitoring your DataSync transfers with task reports. When using this parameter, your caller identity (the IAM role that you're using DataSync with) must have the iam:PassRole permission. The AWSDataSyncFullAccess policy includes this permission. To remove a task report configuration, specify this parameter as empty.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateTask(
        cloudWatchLogGroupArn: String? = nil,
        excludes: [FilterRule]? = nil,
        includes: [FilterRule]? = nil,
        manifestConfig: ManifestConfig? = nil,
        name: String? = nil,
        options: Options? = nil,
        schedule: TaskSchedule? = nil,
        taskArn: String,
        taskReportConfig: TaskReportConfig? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateTaskResponse {
        let input = UpdateTaskRequest(
            cloudWatchLogGroupArn: cloudWatchLogGroupArn, 
            excludes: excludes, 
            includes: includes, 
            manifestConfig: manifestConfig, 
            name: name, 
            options: options, 
            schedule: schedule, 
            taskArn: taskArn, 
            taskReportConfig: taskReportConfig
        )
        return try await self.updateTask(input, logger: logger)
    }

    /// Updates the configuration of a running DataSync task execution.  Currently, the only Option that you can modify with UpdateTaskExecution is  BytesPerSecond , which throttles bandwidth for a running or queued task execution.
    @Sendable
    @inlinable
    public func updateTaskExecution(_ input: UpdateTaskExecutionRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateTaskExecutionResponse {
        try await self.client.execute(
            operation: "UpdateTaskExecution", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates the configuration of a running DataSync task execution.  Currently, the only Option that you can modify with UpdateTaskExecution is  BytesPerSecond , which throttles bandwidth for a running or queued task execution.
    ///
    /// Parameters:
    ///   - options: 
    ///   - taskExecutionArn: Specifies the Amazon Resource Name (ARN) of the task execution that you're updating.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateTaskExecution(
        options: Options,
        taskExecutionArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateTaskExecutionResponse {
        let input = UpdateTaskExecutionRequest(
            options: options, 
            taskExecutionArn: taskExecutionArn
        )
        return try await self.updateTaskExecution(input, logger: logger)
    }
}

extension DataSync {
    /// Initializer required by `AWSService.with(middlewares:timeout:byteBufferAllocator:options)`. You are not able to use this initializer directly as there are not public
    /// initializers for `AWSServiceConfig.Patch`. Please use `AWSService.with(middlewares:timeout:byteBufferAllocator:options)` instead.
    public init(from: DataSync, patch: AWSServiceConfig.Patch) {
        self.client = from.client
        self.config = from.config.with(patch: patch)
    }
}

// MARK: Paginators

@available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *)
extension DataSync {
    /// Return PaginatorSequence for operation ``listAgents(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listAgentsPaginator(
        _ input: ListAgentsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListAgentsRequest, ListAgentsResponse> {
        return .init(
            input: input,
            command: self.listAgents,
            inputKey: \ListAgentsRequest.nextToken,
            outputKey: \ListAgentsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listAgents(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: Specifies the maximum number of DataSync agents to list in a response. By default, a response shows a maximum of 100 agents.
    ///   - logger: Logger used for logging
    @inlinable
    public func listAgentsPaginator(
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListAgentsRequest, ListAgentsResponse> {
        let input = ListAgentsRequest(
            maxResults: maxResults
        )
        return self.listAgentsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listLocations(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listLocationsPaginator(
        _ input: ListLocationsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListLocationsRequest, ListLocationsResponse> {
        return .init(
            input: input,
            command: self.listLocations,
            inputKey: \ListLocationsRequest.nextToken,
            outputKey: \ListLocationsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listLocations(_:logger:)``.
    ///
    /// - Parameters:
    ///   - filters: You can use API filters to narrow down the list of resources returned by ListLocations. For example, to retrieve all tasks on a specific source location, you can use ListLocations with filter name LocationType S3 and Operator Equals.
    ///   - maxResults: The maximum number of locations to return.
    ///   - logger: Logger used for logging
    @inlinable
    public func listLocationsPaginator(
        filters: [LocationFilter]? = nil,
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListLocationsRequest, ListLocationsResponse> {
        let input = ListLocationsRequest(
            filters: filters, 
            maxResults: maxResults
        )
        return self.listLocationsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listTagsForResource(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listTagsForResourcePaginator(
        _ input: ListTagsForResourceRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListTagsForResourceRequest, ListTagsForResourceResponse> {
        return .init(
            input: input,
            command: self.listTagsForResource,
            inputKey: \ListTagsForResourceRequest.nextToken,
            outputKey: \ListTagsForResourceResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listTagsForResource(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: Specifies how many results that you want in the response.
    ///   - resourceArn: Specifies the Amazon Resource Name (ARN) of the resource that you want tag information on.
    ///   - logger: Logger used for logging
    @inlinable
    public func listTagsForResourcePaginator(
        maxResults: Int? = nil,
        resourceArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListTagsForResourceRequest, ListTagsForResourceResponse> {
        let input = ListTagsForResourceRequest(
            maxResults: maxResults, 
            resourceArn: resourceArn
        )
        return self.listTagsForResourcePaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listTaskExecutions(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listTaskExecutionsPaginator(
        _ input: ListTaskExecutionsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListTaskExecutionsRequest, ListTaskExecutionsResponse> {
        return .init(
            input: input,
            command: self.listTaskExecutions,
            inputKey: \ListTaskExecutionsRequest.nextToken,
            outputKey: \ListTaskExecutionsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listTaskExecutions(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: Specifies how many results you want in the response.
    ///   - taskArn: Specifies the Amazon Resource Name (ARN) of the task that you want execution information about.
    ///   - logger: Logger used for logging
    @inlinable
    public func listTaskExecutionsPaginator(
        maxResults: Int? = nil,
        taskArn: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListTaskExecutionsRequest, ListTaskExecutionsResponse> {
        let input = ListTaskExecutionsRequest(
            maxResults: maxResults, 
            taskArn: taskArn
        )
        return self.listTaskExecutionsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listTasks(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listTasksPaginator(
        _ input: ListTasksRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListTasksRequest, ListTasksResponse> {
        return .init(
            input: input,
            command: self.listTasks,
            inputKey: \ListTasksRequest.nextToken,
            outputKey: \ListTasksResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listTasks(_:logger:)``.
    ///
    /// - Parameters:
    ///   - filters: You can use API filters to narrow down the list of resources returned by ListTasks. For example, to retrieve all tasks on a specific source location, you can use ListTasks with filter name LocationId and Operator Equals with the ARN for the location.
    ///   - maxResults: The maximum number of tasks to return.
    ///   - logger: Logger used for logging
    @inlinable
    public func listTasksPaginator(
        filters: [TaskFilter]? = nil,
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListTasksRequest, ListTasksResponse> {
        let input = ListTasksRequest(
            filters: filters, 
            maxResults: maxResults
        )
        return self.listTasksPaginator(input, logger: logger)
    }
}

extension DataSync.ListAgentsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> DataSync.ListAgentsRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension DataSync.ListLocationsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> DataSync.ListLocationsRequest {
        return .init(
            filters: self.filters,
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension DataSync.ListTagsForResourceRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> DataSync.ListTagsForResourceRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token,
            resourceArn: self.resourceArn
        )
    }
}

extension DataSync.ListTaskExecutionsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> DataSync.ListTaskExecutionsRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token,
            taskArn: self.taskArn
        )
    }
}

extension DataSync.ListTasksRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> DataSync.ListTasksRequest {
        return .init(
            filters: self.filters,
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}
